• 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~

  • 相关阅读:
    Spring MVC 通过ajax实现前后台交互
    一些基础的东西总结一下
    如何在页面中引用自定义标签
    Linux(centos)系统下安装fastdfs安装部署步骤,问题复现 并在java中集成测试demo
    Liunx下修改JVM内存大小
    在liunx下安装配置rabbitMQ详细教程
    Oracle创建用户、角色、授权、建表
    要做小程序的订阅推送 本篇 从小程序到后端!!!
    Thymeleaf入门入门入门入门入门入门入门入门入门入门入门
    git clone 解决Permission Denied (publickey)问题
  • 原文地址:https://www.cnblogs.com/coloz/p/11168550.html
Copyright © 2020-2023  润新知