Oracle PL/SQL中的大容量收集

Oracle PL/SQL中的大容量收集,oracle,plsql,Oracle,Plsql,通过使用大容量收集到,您如何在尝试循环遍历结果时检测何时抛出不返回结果以防止异常的查询?您可以使用以下代码: open rc for select descr from hardware; loop fetch rc bulk collect into l_rows limit l_fetch_sizes(i); exit when rc%notfound; end loop; close rc; 完成循环时退出 要捕获批量收集DML操作的异常,您可以SQL%bulk\u异常:

通过使用大容量收集到,您如何在尝试循环遍历结果时检测何时抛出不返回结果以防止异常的查询?

您可以使用以下代码:

open rc for select descr from hardware;
loop
    fetch rc bulk collect into l_rows limit l_fetch_sizes(i);
    exit when rc%notfound;
end loop;
close rc;
完成循环时退出

要捕获批量收集DML操作的异常,您可以SQL%bulk\u异常

BEGIN
    -- DML operations
EXCEPTION
    WHEN operation_erros THEN
    l_error := SQL%BULK_EXCEPTIONS.count;
    FOR ind IN 1 .. l_error LOOP
        DBMS_OUTPUT.put_line('Error: ' || ind || ' Array Index: ' || SQL%BULK_EXCEPTIONS(ind).ERROR_INDEX || ' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(ind).ERROR_CODE));
    END LOOP;
END;

文档中的示例:


大容量收集不会引发“未找到数据”异常。(我试图编辑答案,但不断出错。出于某种原因,服务器不喜欢此答案或我的编辑。)我不明白您为什么在此处使用
SQL%BULK\u异常
SQL%BULK_异常
仅用于使用
FORALL
()的批量DML操作。在大容量收集期间引发的异常通常会引发。你的第二个代码片段有误导性。你是对的!我编辑了我的答案。另外,对于您的第一个代码片段,您应该强调,任何使用
l_行
的代码都位于
退出时的前面,而不是后面。否则,您可能会跳过某些数据-有关更多信息,请参阅的“踢出%NOTFOUND习惯”部分。您是否可以只检查您批量收集的
集合的
计数是否为零?
  OPEN c1;
  LOOP
    FETCH c1 BULK COLLECT INTO names, sals LIMIT v_limit;
    EXIT WHEN names.COUNT = 0;
    print_results();
  END LOOP;
  CLOSE c1;