【发布时间】:2013-10-23 17:13:58
【问题描述】:
通过使用bulk collect into,在尝试循环结果时如何检测不返回结果以防止异常的查询何时被抛出?
【问题讨论】:
-
你能不能只检查你
BULK COLLECT将结果放入的集合的COUNT是否为零?
通过使用bulk collect into,在尝试循环结果时如何检测不返回结果以防止异常的查询何时被抛出?
【问题讨论】:
BULK COLLECT将结果放入的集合的COUNT是否为零?
文档中的一个示例:
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;
【讨论】:
您可以使用此代码:
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;
【讨论】:
SQL%BULK_EXCEPTIONS。 SQL%BULK_EXCEPTIONS 仅用于使用 FORALL (source) 的批量 DML 操作。在BULK COLLECT 期间抛出的异常被正常抛出。您的第二个代码片段具有误导性。
l_rows 相关的代码都在EXIT WHEN ... 之前,而不是在它之后。否则,您最终可能会跳过一些数据 - 请参阅this Steven Feuerstein article 的“摆脱 %NOTFOUND 习惯”部分了解更多信息。