博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

CLEANER

如果你的工作,机器也可以做。那总有一天,你也要变成机器。
   yuechaotian.cublog.cn
关于作者  
name:yuechaotian
employment:coder
age:25
from:NEU
about me:a retardate
email:yuechaotian(at)gmail.com
msn:yuechaotian(at)hotmail.com

我的分类  




批量绑定(1.2)— BULK COLLECT
在《批量绑定(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 数组进行初始化和手工扩展空间。

 发表于: 2008-05-23,修改于: 2008-05-23 08:50 已浏览363次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.01159

京ICP证041476号