Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1702784
  • 博文数量: 136
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3261
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-22 11:26
文章分类

全部博文(136)

文章存档

2010年(1)

2009年(26)

2008年(109)

我的朋友

分类: Oracle

2008-05-23 08:14:46

在《批量绑定(1.1)— BULK COLLECT》中,我们所举的例子都是一次上下文交换就完成的操作。但我们说,“BULK COLLECT 可以降低 SQL 引擎到 PL/SQL 引擎的上下文交换(context switch)次数,从而实现数据的高速检索。”并不是限制必须一次完成。Oracle 提供了 LIMIT 子句,可以限制每次从表中获取的记录数。
 
比如我要对一个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 数组进行初始化和手工扩展空间。

阅读(1430) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~