Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1213425
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2008-01-06 21:09:24

使用BULK COLLECT代替Cursor FOR

       当从Oracle查询多行时,不要使用FOR循环,而是使用BULK COLLECT,可以极大的提高系统的性能,如下:

DECLARE

   TYPE employee_aat IS TABLE OF employee%ROWTYPE

      INDEX BY BINARY_INTEGER;

   l_employees employee_aat;

BEGIN  

   SELECT *    

      BULK COLLECT INTO l_employees    

      FROM employee;

END;

       当然,如果数据很多,可以使用BULK COLLECTLIMIT子句(否则会消耗大量的内存),如下:

DECLARE   

  TYPE employee_aat IS TABLE OF employee%ROWTYPE

      INDEX BY BINARY_INTEGER;

     

  l_employees employee_aat;

 

  CURSOR employees_cur IS SELECT * FROM employee;

BEGIN

    OPEN employees_cur;

    LOOP

        FETCH employees_cur

         BULK COLLECT INTO l_employees LIMIT 100;

        EXIT WHEN l_employees.COUNT = 0;

       

        -- Process these 100 rows and then

       

        -- move on to next 100.

    END LOOP;

END;

需要注意的是:使用BULK COLLECT时,NO_DATA_FOUND异常不会抛出,即使没有数据返回。并且在LIMIT中,不要依赖cursor%FOUND确定提取数据,相反,需要检查集合中的内容。

 

阅读(545) | 评论(0) | 转发(0) |
0

上一篇:关于IN的奇怪现象

下一篇:使用ANYDATA对象

给主人留下些什么吧!~~