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

Posted

技术标签:

【中文标题】Oracle/PLSQL 在 BULK COLLECT 之后处理 for LOOP 中的所有数据【英文标题】:Oracle/PLSQL Processing all data in a for LOOP after BULK COLLECT 【发布时间】:2020-11-21 16:18:26 【问题描述】:

批量收集后在 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 条记录,因为我没有为它们进入循环。 这里有什么问题?

【问题讨论】:

嗯,是的,应该先处理 100 000,然后处理剩下的 2397 如果没有读取 100 000 条记录,它会中断吗? 【参考方案1】:

您的exit 条件不正确。

EXIT WHEN my_cursor%NOTFOUND; 

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

EXIT WHEN var_t.count = 0;

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

【讨论】:

以上是关于Oracle/PLSQL 在 BULK COLLECT 之后处理 for LOOP 中的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PLSQL BULK 收集和 For 循环

不装oracle plsql怎么用

在 Oracle PLSQL 中使用游标的动态列名

Oracle / PLSQL写语句的时候常使用的函数

急! 换电脑之前PLSQL可以正常登陆 换电脑后PLSQL和 ORACLE 都没重装 现在运行plsql登录错误,有空白提示框

在 Oracle PLSQL 上打印等效项