Oracle按数据量分批次提交

留备

DECLARE
  TYPE CUR IS REF CURSOR;
  MY_CUR  CUR;
  COL_NUM SCOTT.EMP_TEST%ROWTYPE;
  NUM     NUMBER(10);
BEGIN
  OPEN MY_CUR FOR
    SELECT * FROM SCOTT.EMP_TEST;
  LOOP
    FETCH MY_CUR
      INTO COL_NUM;
    EXIT WHEN MY_CUR%NOTFOUND;
    NUM := MY_CUR%ROWCOUNT;
    IF MOD(NUM, 5000) = 0 THEN
      COMMIT; /*5000条数据提交一次,注意在游标的for循环中使用commit如果undo空间较小的话可能会出现ORA-01555报错,原因是commit之后的undo数据允许被覆盖,此时如果在commit之前有一个大的、运行时间较长的查询需要展示undo之前的数据信息而undo的数据已经被覆盖就会报ORA-01555错误,解决方法有多重,可以扩大undo表空间的大小,设置undo为自动管理是最好的解决方法,可同时设置UNDO_RETENTION*/
      SYS.DBMS_LOCK.SLEEP(1); --提交后间断1秒(纯属测试^_^)
      DBMS_OUTPUT.PUT_LINE('sleep at ' || NUM || ' rows');
    END IF;
    INSERT INTO SCOTT.EMP_2019
      (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    VALUES
      (COL_NUM.EMPNO,
       COL_NUM.ENAME,
       COL_NUM.JOB,
       COL_NUM.MGR,
       COL_NUM.HIREDATE,
       COL_NUM.SAL,
       COL_NUM.COMM,
       COL_NUM.DEPTNO);
  END LOOP;
  CLOSE MY_CUR;
  COMMIT;
END;

 

你可能感兴趣的:(Oracle)