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;

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值