上一次,我们说明了一下用SELECT BULK COLLECCT INTO的语句进行批量绑定的方式进行取得数据。
本章节说明一下显示游标的FETCH INTO文的批量绑定方式:FETCH BULK COLLEC INTO。
使用FETCH BULK COLLECCT INTO语句的话,可以把FETCH到的所有行一起放到结果集中,也成为了批量绑定方式。
因此,比一行一行地FETCH,性能要好得多。
接下来,我们分别就普通FETCH INTO文的处理和FETCH BULK COLLECCT INTO文的处理进行说明和比较。
TEST01表:
SQL> DESC TEST01
名称 格式
A NUMBER
B VARCHAR2(10)
表里之用以下10行数据,作为例子进行说明:
SQL> SELECT * FROM TEST01 ORDER BY A;
A B
1 AA
2 BB
3 CC
4 DD
5 EE
6 FF
7 GG
8 HH
9 II
10 JJ
选择了10行。
首先使用普通的FETCH INTO文进行显示游标处理:
启用画面显示
SQL> SET SERVEROUTPUT ON
执行以下语句:
SQL> DECLARE
2 --声明游标
3 CURSOR C1 IS SELECT * FROM TEST01 ORDER BY A;
4 --声明记录类型的变量
5 REC C1%ROWTYPE;
6 BEGIN
7 OPEN C1;–打开游标(生成结果集并打开)
8 LOOP-循环处理
9 FETCH C1 INTO REC;-提取1行数据
10 EXIT WHEN C1%NOTFOUND;
11 DBMS_OUTPUT.PUT_LINE(REC.B);–在画面上显示B列的内容
12 END LOOP;
13 CLOSE C1;–关闭游标(关闭打开的结果集)
14 END;
15 /
AA
BB
CC
DD
EE
FF
GG
HH
II
JJ
PL/SQL过程成功完成。
以上是显示游标处理一般的处理方式。
接下来是使用FETCH BULK COLLEC INTO语句进行批量绑定的方式进行处理。
SQL> DECLARE
2 --声明游标
3 CURSOR C1 IS SELECT * FROM TEST01 ORDER BY A;
4 --声明记录类型变量的数组类型
5 TYPE RECTAB_TYPE IS TABLE OF C1%ROWTYPE INDEX BY BINARY_INTEGER;
6 -定义记录类型的配列
7 RECTAB RECTAB_TYPE;
8 --数组变量
9 J BINARY_INTEGER;
10 BEGIN
11 OPEN C1;–打开游标(生成结果集并打开)
12 FETCH C1 BULK COLLECCT INTO RECTAB;–采集结果集里所有数据
13 CLOSE C1;–关闭游标(关闭打开的结果集)
14 --按相反顺序显示数组RECTAB的值
15 J := RECTAB.LAST;–取得配列的最后一个索引值(10号)
16 LOOP-循环处理
17 DBMS_OUTPUT.PUT_LINE(RECTAB(J).B);–在画面上显示
18 EXIT WHEN J = RECTAB.FIRST;–如果是配列的第一个索引值,则退出循环
19 J := RECTAB.PRIOR(J);–取得前一个配列的索引值
20 END LOOP;
21 END;
22 /
JJ
II
HH
GG
FF
EE
DD
CC
BB
AA
PL/SQL过程成功完成。
例子解释如下:
首先,在FETCH BULK COLLEC INTO语句中,因为要统一存储多行数据,所以存储的目标变量必须是数组类型和数组变量。
所以第5行声明了数组类型,第7行使用该类型声明了数组变量
第11行:在执行部打开游标
第12行:打开的游表结果集所有数据整体存储到数组变量中。
第13行:关闭游标(是取出所有的行之后,结果集不需要用了,所以需要及时关闭游标)
通过关闭游标,结果集也会被释放掉,但数组是保留的。
数组与结果集不同,数组可以随机访问任意位置,我们例子是倒叙吧数据遍历了一遍并显示到画面上了。
(JJ→II→・・BB→AA)
总结一下:
FETCH BULK COLLECCT INTO语句的结构如下:
FETCH 游标名 BULK COLLECCT INTO 配列变量 [LIMIT行数]
在上述语法中,[LIMIT行数]的部分是可选的,但是可以指定一次批量提取的行数。
这是SELECT BULK COLLECCT INTO语句中没有的功能。
LIMIT语句可以抑制内存的使用量,有助于提高性能。下章,解说LIMIT语句。
本次到此为止。