1.业务要求:
将oracle表A的整表的数据一次性导入到表B中 , 以A_ID为外键关联.
(*******如果开发环境和实际生产环境的数据一致,而且数据量比较小情况,可以直接手动添加数据;
********实际情况: 开发环境和生产环境数据不一致, 而且开发者没有实际操作数据库的权限~所以通过提交sql脚本来生成数据)
2.实现方式:
这里用到oracle的语句块,游标,以及for循环.
3.准备工作
新建表A和B,添加序列和A表的数据
-- auto-generated definition
create table Z_A
(
ID NUMBER(10) not null
constraint Z_A_PK
primary key,
NAME VARCHAR2(50)
)
/
comment on table Z_A is '测试用表,没有实用'
/ ;
-- auto-generated definition
create table Z_B
(
ID NUMBER(10) not null
constraint Z_B_PK
primary key,
NAME VARCHAR2(50),
A_NAME VARCHAR2(50),
A_ID NUMBER(10)
)
/
comment on table Z_B is '测试用表,没有实用'
/
;
-- 序列
create sequence SEQ_Z_A
increment by 1
start with 1
maxvalue 99999
cycle
nocache;
-- 序列
create sequence SEQ_Z_B
increment by 1
start with 1
maxvalue 99999
cycle
nocache;
给表A添加一点数据:
5.SQL脚本
declare
--声明 B表序列ID
B_SEQ number(10);
--查询所有A表ID
cursor cur_A is select ID, NAME
from Z_A ;
begin
for a in cur_A
loop
-- 查询B表序列ID
select SEQ_Z_B.nextval into B_SEQ from dual;
-- 插入B表数据
INSERT INTO Z_B (ID, NAME, A_NAME, A_ID)
VALUES (B_SEQ, '测试B', a.NAME, a.ID);
-- commit;
end loop;
commit;
end;
6.效果
7.总结
1.声明: declare 关键字
可以用来声明一个变量, 比如上面的 B_SEQ作为 B表序列ID,当然也可以在后面的for里面直接使用 SEQ_Z_B.nextval 填充赋值, 这里是示范一下变量;
具体变量使用可以网上找一下资料,有点类似编程中的定义变量, 变量的类型还有字符串类型,Table类型等;
2.游标: cursor 关键字
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。
在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。
这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率;
上面使用 cur_A将A表的ID和NAME暂时存放到游标中,在下面for循环中使用;
3.for循环:
听说有5中循环方式: Exit When、Loop、While、For(普通循环)、For(游标循环)
请参考: https://blog.csdn.net/qq\_42305423/article/details/80753725
上面使用的是游标循环,有点类似编程中的foreach~