2017-04-12 65 views
0


我們正在使用FORALL ..... SAVE EXCEPTIONS。在循環結束時,我們有這樣的:
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; 

有什麼辦法,我在數組中的實際值獲得?說一個客戶的電子郵件太長了.....我真的要顯示導致錯誤的價值嗎?而不僅僅是一些索引號碼?

謝謝!

+0

的'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. 
+0

但是,我可以看到實際值嗎?就像造成問題的記錄一樣。我可以得到這些價值嗎? –

+0

我打印了實際的記錄本身。如果你看到我的例子,我將通過empid作爲數組。那只是在例外情況下打印。如果你的集合有像xyx這樣的列,那麼你可以使用'(i).xyz'。在我的情況下,如果它是一些列,那麼它會是'V_EMP_ID(i).emp_id' – XING