1 用系统游标,BULK COLLECT LIMIT ,FORALL
DECLARE
-- 定义系统变量
V_CURSOR SYS_REFCURSOR;
-- 定义集合类型
TYPE ARRAY_EMPNO IS TABLE OF EMP.EMPNO % TYPE;
TYPE ARRAY_ENAME IS TABLE OF EMP.EMPNO % TYPE;
TYPE ARRAY_JOB IS TABLE OF EMP.JOB % TYPE;
TYPE ARRAY_HIREDATE IS TABLE OF EMP.HIREDATE % TYPE;
-- 定义集合变量
V_ARRAY_EMPNO ARRAY_EMPNO;
V_ARRAY_ENAME ARRAY_ENAME;
V_ARRAY_JOB ARRAY_JOB;
V_ARRAY_HIREDATE ARRAY_HIREDATE;
-- PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
-- 1 指定游标结果集
OPEN V_CURSOR FOR
SELECT E.EMPNO, E.ENAME, E.JOB, E.HIREDATE FROM EMP E;
-- 2 循环游标
LOOP
DBMS_OUTPUT.put_line('数据了');
-- 3 将结果集批量放入到集合中
FETCH V_CURSOR BULK COLLECT
INTO V_ARRAY_EMPNO, V_ARRAY_ENAME, V_ARRAY_JOB, V_ARRAY_HIREDATE;
-- 4 用 FORALL 批量插入数据库
FORALL I IN 1 .. V_ARRAY_EMPNO.COUNT
INSERT INTO EMP_TEMP
(EMPNO, ENAME, JOB, HIREDATE)
VALUES
(V_ARRAY_EMPNO(I),
V_ARRAY_ENAME(I),
V_ARRAY_JOB(I),
V_ARRAY_HIREDATE(I));
COMMIT;
-- 5 循环退出条件
IF V_CURSOR % NOTFOUND THEN
DBMS_OUTPUT.put_line('无数据了');
END IF;
END LOOP;
-- 6 关闭游标,释放资源
CLOSE V_CURSOR;
EXCEPTION
WHEN OTHERS THEN
CLOSE V_CURSOR;
END;