【问题标题】:Bulk collect in PL/SQL [closed]在 PL/SQL 中批量收集 [关闭]
【发布时间】:2013-10-23 17:13:58
【问题描述】:

通过使用bulk collect into,在尝试循环结果时如何检测不返回结果以防止异常的查询何时被抛出?

【问题讨论】:

  • 你能不能只检查你BULK COLLECT将结果放入的集合的COUNT是否为零?

标签: oracle plsql


【解决方案1】:

文档中的一个示例:
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/tuning.htm#BABCCJCB

  OPEN c1;
  LOOP
    FETCH c1 BULK COLLECT INTO names, sals LIMIT v_limit;
    EXIT WHEN names.COUNT = 0;
    print_results();
  END LOOP;
  CLOSE c1;

【讨论】:

    【解决方案2】:

    您可以使用此代码:

    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;
    

    Exit When完成循环

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

    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;
    

    【讨论】:

    • 批量收集不会引发 NO_DATA_FOUND 异常。 (我试图编辑答案,但我不断收到错误。由于某种原因,服务器不喜欢这个答案或我的编辑。)
    • 我不明白你为什么在这里使用SQL%BULK_EXCEPTIONSSQL%BULK_EXCEPTIONS 仅用于使用 FORALL (source) 的批量 DML 操作。在BULK COLLECT 期间抛出的异常被正常抛出。您的第二个代码片段具有误导性。
    • 你是对的!我编辑我的答案。
    • 另外,对于你的第一个代码片段,你应该强调任何与l_rows 相关的代码都在EXIT WHEN ... 之前,而不是在它之后。否则,您最终可能会跳过一些数据 - 请参阅this Steven Feuerstein article 的“摆脱 %NOTFOUND 习惯”部分了解更多信息。
    猜你喜欢
    • 2021-02-28
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多