留备
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;