FORALL与BULK COLLECT联合使用

1.使用FORALL比FOR效率高,因为前者只切换一次上下文,而后者将是在循环次数一样多个上下文间切换。 
2.使用BLUK COLLECT一次取出一个数据集合,比用游标条取数据效率高,尤其是在网络不大好的情况下。但BLUK COLLECT需要大量内存。
下面看三个例子
例1:在select into 中使用 forall bulk collect;

点击(此处)折叠或打开

  1. create table test_forall ( user_id number(10), user_name varchar2(20));
  2. SELECT * FROM ex_edm_esp;
  3. SELECT * FROM test_forall;
  4. DECLARE
  5.   TYPE forall_table IS TABLE OF test_forall%ROWTYPE;
  6.   test_table forall_table;
  7. BEGIN
  8.   SELECT id, esp_name BULK COLLECT INTO test_table FROM ex_edm_esp;
  9.   FORALL idx IN test_table.first .. test_table.last
  10.     INSERT INTO test_forall VALUES test_table (idx);
  11.   COMMIT;
  12. EXCEPTION
  13.   WHEN OTHERS THEN
  14.     ROLLBACK;
  15. END;

例2: 在fetch into中使用 forall, indices of, bulk collect;

点击(此处)折叠或打开

  1. DECLARE
  2.   TYPE forall_table IS TABLE OF test_forall%ROWTYPE;
  3.   test_table forall_table;
  4.   CURSOR test_cur IS
  5.     SELECT empno, ename FROM emp;
  6. BEGIN
  7.   OPEN test_cur;
  8.   FETCH test_cur BULK COLLECT
  9.     INTO test_table;
  10.   CLOSE test_cur;

  11.   -- 跳过集合中的null元素
  12.   FORALL idx IN INDICES OF test_table --test_table.first..test_table.last
  13.     INSERT INTO test_forall VALUES test_table (idx);
  14.   COMMIT;
  15. EXCEPTION
  16.   WHEN OTHERS THEN
  17.     ROLLBACK;
  18. END;

例3: 在returning into 之中使用 forall in, value of, bulk collect

点击(此处)折叠或打开

  1. DECLARE
  2.   TYPE t_user_id IS TABLE OF test_forall.user_id%TYPE;
  3.   t1 t_user_id;
  4.   TYPE t_user_name IS TABLE OF test_forall.user_name%TYPE;
  5.   t2 t_user_name;
  6. BEGIN
  7.   DELETE FROM test_forall
  8.   RETURNING user_id, user_name BULK COLLECT INTO t1, t2;
  9.   FOR i IN t1.first .. t1.last LOOP
  10.     dbms_output.put_line(t1(i) || '----' || t2(i));
  11.   END LOOP;
  12.   ROLLBACK;
  13. EXCEPTION
  14.   WHEN OTHERS THEN
  15.     ROLLBACK;
  16. END;


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21251711/viewspace-2120108/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21251711/viewspace-2120108/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值