试图获取导致异常的实际数据

时间:2017-05-09 20:39:12

标签: oracle exception plsql associative-array

我有一个过程,它接受2个关联数组的输入,经过一些基本的计数检查,做一个FORALL语句将数据插入表中。

以下是程序:

    PROCEDURE   INSERT_RECS(P_PROD_TYP IN prod_type, P_PROD_ADD_PK IN prod_pk_type) 
        IS

        uniq_key EXCEPTION;
        PRAGMA EXCEPTION_INIT(uniq_key, -00001);
        loc_cnt  NUMBER;

        BEGIN
            IF P_PROD_TYP.COUNT = P_PROD_ADD_PK.COUNT THEN
               FORALL i IN P_PROD_TYP.FIRST .. P_PROD_TYP.LAST
                INSERT INTO product_table ( pk, 
                                            id,
                                            created_by,
                                            created_on,
                                            last_chg_by, 
                                            last_chg_on)
                                    VALUES (P_PROD_ADD_PK(i),
                                            P_PROD_TYP(i).id,
                                            P_PROD_TYP(i).created_by,
                                            P_PROD_TYP(i).created_on,
                                            NULL,
                                            NULL);

            END IF;
        EXCEPTION
            WHEN uniq_key THEN
                loc_cnt := SQL%BULK_EXCEPTIONS.count;
                FOR i IN 1 .. loc_cnt LOOP
                    dbms_output.put_line('EXCEPTION: Array Index: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
                            ' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE) || 
                            ' SQLERRM: ' || SQLERRM || 
                            ' SQLCODE: ' || SQLCODE ||    
                            ' stack: ' || SYS.dbms_utility.format_call_stack);
                END LOOP;    
                RETURN;
        END;

我想要的是如果我遇到异常,是否有办法可以查看导致问题的记录,实际上是关联数组中的索引或至少有SQL%信息有信息

我看了以下内容: http://www.dba-oracle.com/plsql/t_plsql_exceptions.htm

但这会输出有关该列的信息,但这不是我所追求的。

1 个答案:

答案 0 :(得分:0)

不确定是否真的回答了您的查询,但您可以在异常块中使用循环变量i来显示您的案例中的异常数组的内容。请参阅下面的示例程序:

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.