PL/SQL开发--bulk collect的用法

bulk collect是可以看做是一种批获取的方式,在我们的plsql的代码段里经常作为into的扩展来使用。对于select id into v from .... 是一个常用的用法。不过这里只能是返回单条记录的时候,才能使用,如果是有多条记录我们就不能用这样的方式,而是使用fetch和循环的方式,不仅使用麻烦,而且性能也底下,这时我们的bulk collect隆重登场了,解决我们的问题。

 

通过bulk collect可以把我们的查询结果一次性地加载到我们的嵌入表中。这样我们不需要很麻烦的用游标的循环一条一条的去fetch叻,可想而知,这样不仅操作方便,也可以获得相当不错的程序性能。 我们可以在select into, fetch into, returning into的句子中使用。下面我们通过对以上各个例子来进行演示来看看他们的用法

 

先来看看我们的测试表和数据 

 

SQL> desc test; 

Name Null? Type 
----------------------------------------- -------- ---------------------------- 
ZC_CODE VARCHAR2(20) 
MONEY NUMBER(35) 
MONEY_2 NUMBER(35) 

 


SQL> col zc_code format a20; 
SQL> col money format 999999.99; 
SQL> col money_2 format 9999.99; 

SQL>select * from test;


ZC_CODE MONEY MONEY_2 
-------------------- ---------- -------- 
201 18600.00 
20101 9600.00 
2010101 3300.00 
2010102 3200.00 
2010103 3100.00 
20102 9000.00 
2010201 2000.00 
2010202 7000.00 
8 rows selected. 

 

定义我们的嵌套表的类型, 定义在一个package里,这个package使我们的数据类型集合 


SQL> create or replace package ALL_DATA_TYPE is 
2 type T_TESTROW is table of test1.test%rowtype index by binary_integer; 
3 type T_TESTZCCODE is table of test1.test.zc_code%type index by binary_integer; 
4 end; 
5 / 

 

先来个select into的例子 
SQL> create or replace function test_bulkcollect return ALL_DATA_TYPE.T_TESTROW is 
2 v_rtn ALL_DATA_TYPE.T_TESTROW; 
3 begin 
4 select * bulk collect into v_rtn from test; 
5 return v_rtn; 
6 end; 
7 / 

 

统一的测试方法, 我们分别用这个测试代码来演示以上select into,fetch into和returning into的例子 


SQL> declare 
2 v_test ALL_DATA_TYPE.T_TESTROW; 
3 begin 
4 v_test := test_bulkcollect; 
5 for i in 1..v_test.count loop 
6 dbms_output.put_line(i||'='||v_test(i).zc_code||','||v_test(i).money||','||v_test(i).money_2); 
7 end loop; 
8 end; 
9 / 


1=201,18600, 
2=20101,9600, 
3=2010101,3300, 
4=2010102,3200, 
5=2010103,3100, 
6=20102,9000, 
7=2010201,2000, 
8=2010202,7000,

 

用动态sql的bulk collect into来一个 
SQL> create or replace function test_bulkcollect return ALL_DATA_TYPE.T_TESTROW is 
2 v_rtn ALL_DATA_TYPE.T_TESTROW; 
3 begin 
4 execute immediate 'select * from test' bulk collect into v_rtn; 
5 return v_rtn; 
6 end; 

 

测试结果 


1=201,18600, 
2=20101,9600, 
3=2010101,3300, 
4=2010102,3200, 
5=2010103,3100, 
6=20102,9000, 
7=2010201,2000, 
8=2010202,7000,

 

使用fetch的例子

SQL> create or replace function test_bulkcollect return ALL_DATA_TYPE.T_TESTROW is 
2 v_rtn ALL_DATA_TYPE.T_TESTROW; 
3 cursor c is select zc_code, money, nvl(money_2, 0) money_2 from test; 
4 begin 
5 open c; 
6 fetch c bulk collect into v_rtn; 
7 close c; 
8 --execute immediate 'select * from test' bulk collect into v_rtn; 
9 return v_rtn; 
10 end; 
11 / 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inthirties

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值