Oracle BULK COLLECT INTO批量操作应用

Oracle开发中,BULK COLLECT INTO用于批量处理大量数据,但无LIMIT时可能导致PGA溢出。使用LIMIT关键字能有效控制内存使用,防止此类错误发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Oracle开发中,有时我们会使用BULK COLLECT INTO批量操作大量的数据,如果没有LIMIT限制,则Oracle会读取查询的所有记录行到内存中,这样很容易造成PGA溢出而导致出现错误。所以使用LIMIT关键字可以避免PGA溢出。

示例:
SQL> DECLARE
  2    TYPE typ_emp IS TABLE OF emp%ROWTYPE INDEX BY PLS_INTEGER;
  3    v_emp typ_emp;
  4
  5    v_emp_id   tab_emp_id;
  6    v_total_id tab_emp_id := tab_emp_id();
  7
  8    v_limit NUMBER := 3;
  9
 10    v_test emp%ROWTYPE;
 11
 12    CURSOR cur_emp IS
 13      SELECT * FROM emp;
 14  BEGIN
 15    OPEN cur_emp;
 16
 17    LOOP
 18      FETCH cur_emp BULK COLLECT
 19        INTO v_emp LIMIT v_limit;
 20
 21      FORALL j IN v_emp.first .. v_emp.last
 22        INSERT INTO t_emp
 23        VALUES
 24          (seq_emp.nextval,
 25           v_emp(j).ename)
 26        RETURNING id BULK COLLECT INTO v_emp_id;
 27
 28      v_total_id := v_total_id MULTISET UNION ALL v_emp_id;
 29      EXIT WHEN v_emp.count < v_limit;
 30
 31    END LOOP;
 32
 33    CLOSE cur_emp;
 34
 35    FOR rec IN (SELECT *
 36                  FROM t_emp
 37                 WHERE id IN (SELECT column_value FROM TABLE(v_total_id)))
 38    LOOP
 39      dbms_output.put_line(rec.id || '---------->' || rec.name);
 40    END LOOP;
 41
 42    COMMIT;
 43
 44  END;
 45  /
86---------->SMITH_甯
87---------->ALLEN
88---------->WARD
89---------->JONES
90---------->MARTIN
91---------->BLAKE
92---------->CLARK
93---------->SCOTT
94---------->KING
95---------->TURNER
96---------->ADAMS
97---------->JAMES
98---------->FORD
99---------->MILLER

PL/SQL procedure successfully completed.

SQL>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值