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

网友投稿 346 2022-09-14

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 /

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:YRCloudFile V6.8.0 发布:向全闪时代迈进
下一篇:营销案例精选:内外神文案、乡村爱情盲盒…| 案例一周
相关文章

 发表评论

暂时没有评论,来抢沙发吧~