比如我要对一个10w条记录的表进行操作,一次上下文交换就可以将这10w条记录获取到内存中。但该会话的 PGA
空间是否足够呢?或者并发访问时,是否有足够的内存空间存放多个用户的数据呢?使用LIMIT,你可以分批处理这些数据,比如每次处理1000条。下面我们举个小例子:
|
SQL>
declare
2
cursor cur_ic01 is
3
select *
4
from ic01
5
where rownum < 1002;
6
7
type tva_ic01 is varray(100) of
cur_ic01%rowtype;
8
va_ic01 tva_ic01;
9
begin
10
open cur_ic01;
11
loop
12
fetch cur_ic01 bulk collect into va_ic01
limit(100);
13
if va_ic01.count = 0 then exit; end
if;
14
15
-- Now you can manipulate the subset of 100.
16
dbms_output.put_line( 'COUNT: ' || va_ic01.count
);
17
end loop;
18
close cur_ic01;
19
20
va_ic01.delete;
21
end;
22
/
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
100
COUNT:
1
PL/SQL 过程已成功完成。 |
在这个例子中,将处理1001条记录,每次处理100条记录,总共循环11次。
注意:
1. 判断循环是否应该结束,不能使用 %NOTFOUND,而是使用 COUNT
方法。
2. 这里使用的是 VARRAY
数组,你也可以使用联合数组或嵌套表实现。
3. BULK COLLECT 的一个特点:BULK COLLECT
结果集到一个集合变量前,会先将该集合变量清空,然后再赋值。所以最后一次显示的 COUNT
值为1。
4. 使用 BULK COLLECT,你不需要在对嵌套表或 VARRAY 数组进行初始化和手工扩展空间。