0
点赞
收藏
分享

微信扫一扫

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 条评论