听说bulk into 能减少SQL和PLSQL之间的切换! 可本公司采用cur cur_mms_send is --返回数量有500万行
select provcode from table_a
open cur_mms_send;
loop
fetch cur_detail bulk collect into
l_ary_provcode_tmp1
limit 10000;
forall i in 1..l_ary_provcode_tmp1.count
insert into sms_down
(
provcode
)
values
(
l_ary_provcode_tmp1(i)
);
commit;
exit when cur_mms_send%notfound or cur_mms_send%notfound is null;
end loop;
close cur_mms_send;
上面本来可以用一条语句实现
Insert into sms_down
select provcode from table_a ;好像并没有发生切换问题!
1 bulk 在什么情况下会发生切换很多次
2 上面本来一条语句实现的 大数量下为什么也要采用BULK INTO 方法?
select provcode from table_a
open cur_mms_send;
loop
fetch cur_detail bulk collect into
l_ary_provcode_tmp1
limit 10000;
forall i in 1..l_ary_provcode_tmp1.count
insert into sms_down
(
provcode
)
values
(
l_ary_provcode_tmp1(i)
);
commit;
exit when cur_mms_send%notfound or cur_mms_send%notfound is null;
end loop;
close cur_mms_send;
上面本来可以用一条语句实现
Insert into sms_down
select provcode from table_a ;好像并没有发生切换问题!
1 bulk 在什么情况下会发生切换很多次
2 上面本来一条语句实现的 大数量下为什么也要采用BULK INTO 方法?
特别是对于某些时候,我们需要使用游标一条记录、一条记录地处理,就可能使用了多次循环。在这种情况,我们就可以使用批量集合,一次性地把记录取出,放入一个集合变量中,然后再对该变量进行处理,减少系统的开销。
LIMIT对于BULK COLLECT来说是非常有用的。它帮助你清楚地了解并管理程序所用到过程数据。比如说,你要精确地查询并处理1000条记录。你可以使用BULK COLLECT来取出这些记录,并且产生了一个相对较大的集合。但是这种方法会消耗许多PGA(全局进程区)内存。如果这个代码是被很多独立的会话使用,那么你的应用就会因为PGA频繁的页面交换而效率低下。
而不是通过cursor一条一条地处理。
注意在使用bulk collect时,所有的into变量都必须是collections.
open cursor;
loop
fetch cursor bulk collect limite 1
end loop ;
如果limite1的话 还是跟普通游标一样了