FORALL......保存例外
Posted
技术标签:
【中文标题】FORALL......保存例外【英文标题】:FORALL......SAVE EXCEPTIONS 【发布时间】:2017-04-12 00:17:42 【问题描述】:我们正在使用 FORALL .....保存例外。在循环结束时,我们有这样的:
FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP<BR><BR>
DBMS_OUTPUT.PUT_LINE('ERROR CREATING STAGING TICKER: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));<BR><BR>
DBMS_OUTPUT.PUT_LINE('INDEX INFO: ' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);<BR>
END LOOP;
有什么方法可以让我获得该数组中的实际值?假设客户的电子邮件是否太长.....我无法实际显示导致错误的值?而不仅仅是一些索引号?
谢谢!
【问题讨论】:
ERROR_INDEX
为您提供失败的原始集合的索引。您可以返回该集合以获取实际值吗?
【参考方案1】:
您可以使用循环变量i
在您的情况下显示exception
数组的内容。请参阅下面的示例过程:
CREATE OR REPLACE PROCEDURE PROC1 (V_EMP_ID DBMS_SQL.NUMBER_TABLE)
IS
lv_error_string VARCHAR2(4000);
BEGIN
FORALL INDX IN V_EMP_ID.FIRST..V_EMP_ID.LAST SAVE EXCEPTIONS
UPDATE EMPLOYEES
---trying to rasie an exception by using a calculation
SET SALARY=SALARY * 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
WHERE ID_E= V_EMP_ID(INDX);
EXCEPTION
WHEN OTHERS
THEN
FOR i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
LOOP
---Am printing the value of the exception array.
dbms_output.put_line('exception Raised for record' ||V_EMP_ID(i));
END LOOP;
END;
/
输出:
SQL> DECLARE
empid DBMS_SQL.NUMBER_TABLE;
BEGIN
empid (1) := 1;
empid (2) := 9;
PROC1 (empid);
END;
/
exception Raised for record 1
PL/SQL procedure successfully completed.
【讨论】:
但是,我可以看到实际值吗?就像导致问题的记录一样。我能得到这些值吗? 我自己打印了实际记录。如果您看到我的示例,我将 empid 作为数组传递。那只是在例外情况下打印。如果您的收藏有像 xyx 这样的列,那么您可以使用<yourcollection>(i).xyz
。在我的情况下,如果它是一些列,那么它将是V_EMP_ID(i).emp_id
以上是关于FORALL......保存例外的主要内容,如果未能解决你的问题,请参考以下文章