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行处,否则会出现丢数据现象。其中的原理读者可以自己思考。