c语言sscanf函数的用法是什么
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~