首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用循环将Oracle大容量收集到集合

使用循环将Oracle大容量收集到集合
EN

Stack Overflow用户
提问于 2017-08-21 12:58:16
回答 1查看 1.9K关注 0票数 1

http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html

在这一页中,他们提到:

当您使用大容量收集和集合从游标中获取数据时,您不应该依赖游标属性来决定是否终止循环和数据处理。

他提到,为了确保查询处理所有行,我们应该

不使用:

退出时 光标%NOTFOUND;

我们应该使用:

退出时 collectionvariable.count=0;

原因何在?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-21 13:09:08

文章明确指出,当使用cur%NOTFOUND时,它将跳过处理某些记录。

请查看完整的示例:

代码语言:javascript
复制
DECLARE
  TYPE item_tab IS TABLE OF PLS_INTEGER;
  l_item item_tab;
  CURSOR get_item_value IS
  SELECT LEVEL
  FROM dual
  CONNECT BY LEVEL <= 25;
BEGIN
  OPEN get_item_value;
  LOOP
     FETCH get_item_value BULK COLLECT INTO l_item LIMIT 10;  -- 10    10    5
     EXIT WHEN get_item_value%NOTFOUND;                       -- FALSE FALSE TRUE
     DBMS_OUTPUT.put_line(l_item.COUNT);       
  END LOOP;
  CLOSE get_item_value;
END;

输出:

代码语言:javascript
复制
10
10
-- 5 record left

第二版:

代码语言:javascript
复制
DECLARE
  TYPE item_tab IS TABLE OF PLS_INTEGER;
  l_item item_tab;
  CURSOR get_item_value IS
  SELECT LEVEL
  FROM dual
  CONNECT BY LEVEL <= 25;
BEGIN
  OPEN get_item_value;
  LOOP
     FETCH get_item_value BULK COLLECT INTO l_item LIMIT 10;   -- 10   10   5   0
     EXIT WHEN l_item.COUNT = 0;                               -- F    F    F   T
     DBMS_OUTPUT.put_line(l_item.COUNT);
  END LOOP;
  CLOSE get_item_value;
END;

输出:

代码语言:javascript
复制
10
10
5
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45797775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档