Oracle使用语句块之循环插入数据

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~

原文地址:https://www.cnblogs.com/coloz/p/11168550.html