【发布时间】: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被清空并再次填充。