【问题标题】:Why doesn't the collection get populated with OPEN cursor BULK COLLECT .. LIMIT为什么集合没有填充 OPEN cursor BULK COLLECT .. LIMIT
【发布时间】:2020-04-18 07:31:37
【问题描述】:

我正在尝试使用批量收集 .. 限制子句填充集合。如果我无限制地使用普通的 BULK COLLECT,代码就可以工作。但是使用 BULK COLLECT .. LIMIT 循环,集合不会被填充。我也不明白为什么当没有更多值要获取时 collectionname.COUNT = 0 。

代码如下:

DECLARE
   c_limit PLS_INTEGER := 5;

   CURSOR employees_cur
   IS
      SELECT employee_id
        FROM employees;

   TYPE employee_ids_t IS TABLE OF 
      employees.employee_id%TYPE;

   l_employee_ids   employee_ids_t;
BEGIN
   OPEN employees_cur;

   LOOP
      FETCH employees_cur
      BULK COLLECT INTO l_employee_ids
      LIMIT c_limit;

   dbms_output.put_line ('after bulk collect count '||l_employee_ids.COUNT);
   dbms_output.put_line ('after bulk collect first '||l_employee_ids.FIRST);
   dbms_output.put_line ('after bulk collect last '||l_employee_ids.LAST);

      EXIT WHEN l_employee_ids.COUNT = 0;

   END LOOP;

   CLOSE employees_cur;

    dbms_output.put_line ('Outside loop: ');
   dbms_output.put_line ('after bulk collect count '||l_employee_ids.COUNT);
   dbms_output.put_line ('after bulk collect first '||l_employee_ids.FIRST);
   dbms_output.put_line ('after bulk collect last '||l_employee_ids.LAST);
EXCEPTION
 WHEN OTHERS THEN
   dbms_output.put_line ('Error: '||SQLERRM);
END;

没有引发异常。在循环集合之外。COUNT 显示为 0,FIRST 和 LAST 为 NULL。 我不明白出了什么问题。该代码几乎是来自 Oracle 博客示例的逐字记录(put_lines 除外)。 https://blogs.oracle.com/oraclemagazine/bulk-processing-with-bulk-collect-and-forall

(代码清单 6:获取指定的行数)

我在 12.1 甲骨文

在每次迭代的循环内,COUNT = LIMIT 值,FIRST 为 1,LAST =COUNT 是打印的值。

【问题讨论】:

  • l_employee_ids.COUNT 在循环之后等于 0(零),因为这是您的退出条件。只要COUNT 不为零,您就会一直处于循环状态。你期望它是什么?
  • @Abra 我在示例中使用它。我不明白为什么它是 0。如果我们在每个循环中将 5 个元素放入集合中,那么集合计数不应该像 5、10、15 等吗?
  • 引用您链接到的文章:无论我需要获取多少行,我的会话消耗的内存都不会超过这 100 行所需的内存换句话说,l_employee_ids 根据您在问题中发布的代码,将从不包含超过 5 行。在每次循环迭代中,l_employee_ids 被清空并再次填充。

标签: sql oracle plsql


【解决方案1】:

您希望在每个循环期间将数据添加到集合中。例如,在第二个循环之后,您希望集合中的数据为 10。但是限制不起作用,您必须使用集合在循环本身内部,因为在每次迭代中,集合几乎有 5 个元素,这是集合的 LIMIT

【讨论】:

  • 谢谢!这就是我一直在寻找的顿悟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多