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
条件移动到循环的结尾而不是开头。
批量收集后在 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
条件移动到循环的结尾而不是开头。