FORALL与BULK COLLECT的使用方法

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

1).在select into 中使用 forall bulk collect;
create table test_forall ( user_id number ( 10 ), user_name varchar2 ( 20 ));
SELECT * FROM ex_edm_esp;
SELECT * FROM test_forall;
DECLARE
TYPE forall_table
IS TABLE OF test_forall % ROWTYPE;
test_table forall_table;
BEGIN
SELECT ID,esp_name BULK COLLECT INTO test_table FROM ex_edm_esp;
FORALL idx
IN test_table.first..test_table.last
INSERT INTO test_forall VALUES test_table(idx);
COMMIT ;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK ;
END ;
for all 的另一种写法:
FORALL idx IN VALUE OF test table
DECLARE
TYPE forall_table
IS TABLE OF test_forall%ROWTYPE;
test_table forall_table;
CURSOR test_cur IS SELECT ID,esp_name FROM ex_edm_esp;
BEGIN
OPEN test_cur;
FETCH test_cur BULK COLLECT INTO test_table;
CLOSE test_cur;

-- 跳过集合中的null元素
FORALL idx IN INDICES OF test_table
INSERT INTO test_forall VALUES test_table(idx);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
在returning into 之中使用 forall in, value of, bulk collect;
DECLARE
TYPE t_user_id
IS TABLE OF test_forall.user_id%TYPE;
t1 t_user_id;
TYPE t_user_name
IS TABLE OF test_forall.user_name%TYPE;
t2 t_user_name;
BEGIN
DELETE FROM test_forall RETURNING user_id, user_name BULK COLLECT INTO t1,t2;
FOR i IN t1.first..t1.last
LOOP
dbms_output.put_line(t1(i));
dbms_output.put_line(t2(i));
END LOOP;
ROLLBACK;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
from:http://www.blogjava.net/hwpok/archive/2011/07/13/354241.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值