Oracle/PLSQL 在 BULK COLLECT 之后处理 for LOOP 中的所有数据

Oracle/PLSQL Processing all data in a for LOOP after BULK COLLECT

批量收集后在 for 循环中处理数据时遇到问题。

OPEN my_cursor;
LOOP
FETCH my_cursor BULK COLLECT INTO var_t LIMIT 100000;
DBMS_OUTPUT.PUT_LINE('There is ' || var_t.COUNT || ' records found.');
EXIT WHEN my_cursor%NOTFOUND; 
FOR i IN var_t.FIRST .. var_t.LAST
LOOP
var_read_cnt := var_read_cnt + 1;
END LOOP;
END LOOP;
close my_cursor;
DBMS_OUTPUT.put_line('read/inserted : '|| var_read_cnt);

输出看起来像这样

找到 100000 条记录。 找到 2397 条记录。 操纵:100000

获取和批量部分是正确的我确实有 100000+2397 条记录。 但是我无法在循环中处理 2397 条记录,因为我没有进入循环。 这里有什么问题?

您的 exit 条件不正确。

EXIT WHEN my_cursor%NOTFOUND; 

如果 fetch 语句获取的行数少于 limit 允许的行数,%notfound 将为 true。但是您仍然想处理您获取的行。最简单的方法是将代码更改为

EXIT WHEN var_t.count = 0;

或者将您的 exit 条件移动到循环的结尾而不是开头。