zoukankan      html  css  js  c++  java
  • 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~

  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/coloz/p/11168550.html
Copyright © 2011-2022 走看看