8.2.4 使用BULK COLLECT和FOR语句的游标

游标中通常使用FETCH…INTO…语句提取数据,这种方式是单条数据提取,在数据量很大的情况下执行效率不是很理想。而FETCH…BULK COLLECT INTO语句可以批量提取数据,在数据量大的情况下它的执行效率比单条提取数据的高。

此语句的用法可以参考如下示例。

【示例4】利用BULK COLLECT方式批量提取数据

具体代码如下:


01 DECLARE

02 CURSOR pdct_collect_cur

03 IS SELECT*FROM PRODUCTINFO;

04

05 TYPE PDCT_TAB IS TABLE OF PRODUCTINFO%ROWTYPE;

06 pdct_rd PDCT_TAB;

07

08 BEGIN

09 OPEN pdct_collect_cur;

10 LOOP

11

12 FETCH pdct_collect_cur BULK COLLECT INTO pdct_rd LIMIT 2;

13 FOR i in 1..pdct_rd.count LOOP

14 DBMS_OUTPUT.PUT_LINE('产品ID:'||pdct_rd(i).productid||'产品名称:'||

15 pdct_rd(i).productname||'产品价格:'||

16 pdct_rd(i).productprice);

17 END LOOP;

18 EXIT WHEN pdct_collect_cur%NOTFOUND;

19

20 END LOOP;

21 CLOSE pdct_collect_cur;

22 END;


【代码解析】

❑第1~3行声明游标名称,关联查询语句。

❑第5~6行表示的是定义和表PRODUCTINFO行对象一致的集合类型pdct_rd,该变量用于存放批量得到的数据。

❑第10行和第20行对应,这里是迭代从结果集取数据。

❑第12行表示从结果集批量提取数据,每次提取两条。

❑第13行表示遍历集合对象pdct_rd中的数据,该行的LOOP与第17行对应。

❑第14~16行表示输出结果。

❑第18行判断游标是否到最尾端。

【执行效果】

在PL/SQL Developer的SQL窗口中执行以上代码。执行结果见SQL窗口中的Output标签页面,打印输出结果如下:


产品ID:0240010001 产品名称:天堂伞 产品价格:59

产品ID:0240040001 产品名称:夏普LCD-46G100A 产品价格:7000

产品ID:0240030001 产品名称:海尔XQB50-918A 产品价格:1100

产品ID:0240030002 产品名称:三星WF-R1065S/XSC 产品价格:3600

产品ID:0240030003 产品名称:三星XQB55-T86A/XSC 产品价格:2500

产品ID:0240050001 产品名称:台电C430T 产品价格:400

产品ID:0240020001 产品名称:思科RV082路由器 产品价格:2800


注意 判断游标是否到尾端的代码一定不能放到第13行处,否则会出现丢数据现象。其中的原理读者可以自己思考。