看完这章你会学习到以下内容:

  1. 用MOD求余方法,对即将插入的数据进行划分提交.
  2. COMMIT的用法.

基本程序块:

For 变量 in 游标 Loop
    IF MOD(SQL%ROWCOUNT,100000) = 0 THEN
        COMMIT;
    END IF;
    COMMIT;  -- 剩余100000行的数据再提交
End Loop;

某个实例,用于记录游标遍历第几行

 -- 数据插入一次提交(数据量太大占用内存时间太长太大)
        BEGIN
          DELETE FROM EMP_SYN; -- 清空数据支持重跑
          INSERT INTO EMP_SYN
            SELECT * FROM EMP;
          COMMIT;
        END;
        
        -- 分批提交数据
        DECLARE
          CURSOR C_EMP IS
            SELECT * FROM EMP;
        BEGIN
          DELETE FROM EMP_SYN;     -- 清空数据(数据量少)支持重跑
          FOR T_EMP IN C_EMP LOOP
              INSERT INTO EMP_SYN
              SELECT *
                FROM emp;
              IF mod(C_EMP%ROWCOUNT,10000)=0 THEN   -- 每插入1万行提交一次
                COMMIT;
              END IF;
                            COMMIT;    --- 剩余不够1万行的数据都INSERT 
          END LOOP;
        END;

ROWCOUNT使用:
SQL%ROWCOUNT 用于记录修改的条数,必须放在一个增删改等修改类语句后面执行,SQL%ROWCOUNT 之前执行的最近条语句修改数为准

BEGIN
    DELETE FROM emp;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);   -- 记录删除数据的条数
    INSERT INTO emp(empno) VALUES (7777);
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);   -- 记录插入数据的条数
    UPDATE emp SET comm=1000 WHERE empno=7369;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);   -- 记录更新数据的条数
END;

蜗牛
27 声望13 粉丝