Oracle Bulk Collect into Collection 使用 LOOP
Oracle Bulk Collect into Collection using LOOP
http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html
在此页面中,他们提到:
When you are using BULK COLLECT and collections to fetch data from your cursor, you should never rely on the cursor attributes to decide whether to terminate your loop and data processing.
他提到,为了确保我们的查询处理所有行,我们应该
不使用:
EXIT WHEN
cursor%NOTFOUND;
我们应该使用:
EXIT WHEN
collectionvariable.count=0;
这是什么原因?
文章明确指出,当使用 cur%NOTFOUND
时,它将跳过处理某些记录。
请检查独立示例:
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;
输出:
10
10
-- 5 record left
第二个版本:
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;
输出:
10
10
5
http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html
在此页面中,他们提到:
When you are using BULK COLLECT and collections to fetch data from your cursor, you should never rely on the cursor attributes to decide whether to terminate your loop and data processing.
他提到,为了确保我们的查询处理所有行,我们应该
不使用:
EXIT WHEN
cursor%NOTFOUND;
我们应该使用:
EXIT WHEN
collectionvariable.count=0;
这是什么原因?
文章明确指出,当使用 cur%NOTFOUND
时,它将跳过处理某些记录。
请检查独立示例:
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;
输出:
10
10
-- 5 record left
第二个版本:
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;
输出:
10
10
5