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 这样的列,那么您可以使用 &lt;yourcollection&gt;(i).xyz 。在我的情况下,如果它是一些列,那么它将是V_EMP_ID(i).emp_id

以上是关于FORALL......保存例外的主要内容,如果未能解决你的问题,请参考以下文章

用keychain这个特点来保存设备唯一标识。

值未保存到mysql数据库中

android 如何获取保存的图片的地址 并存到数据库中

Spring JPA实体不保存到数据库

如何在使用 Hibernate 保存数据之前检查特殊条件

火狐浏览器如何让系统再次弹出保存密码提示