2013-07-21 77 views
0

我具有以下代碼結構跟蹤散裝插入/更新失敗的事務/刪除

PROCEDURE .. 
    PRAGMA EXCEPTION_INIT(dml_errors, -24381); 
    l_errors   NUMBER; 

BEGIN 
    -- busines logic 
    FORALL TABLE_1 do delete; 
    FORALL TABLE_1 do update; 
    FORALL TABLE_1 do insert; 
    FORALL TABLE_2 do insert; 
    FORALL TABLE_2 do update; 
    FORALL TABLE_2 do insert; 
EXCEPTION 
    WHEN dml_errors then 
    --extract error indexes 
END; 

的每一個與陣列即一個單獨的表,它是從TABLE_1刪除將處理一個循環中的forall的循環優惠table_1_u的索引表由pls_integer提供;

每個FORALL循環具有保存例外關鍵字

現在,我怎麼可以提取「爲」失敗「它記錄在該指標不合格」。

回答

3

我如何可以提取 「爲」 失敗

通過調用堆棧(FORMAT_ERROR_BACKTRACE) 或實現某種步驟:

PROCEDURE .. 
    PRAGMA EXCEPTION_INIT(dml_errors, -24381); 
    l_errors   NUMBER; 
    iStep NUMBER; 
BEGIN 
    -- busines logic 
    iStep := 0; 
    FORALL TABLE_1 do delete; 
    iStep := 1; 
    FORALL TABLE_1 do update; 
    iStep := 2; 
    FORALL TABLE_1 do insert; 
    iStep := 3; 
    FORALL TABLE_2 do insert; 
    iStep := 4; 
    FORALL TABLE_2 do update; 
    iStep := 5; 
    FORALL TABLE_2 do insert; 
EXCEPTION 
    WHEN dml_errors then 
     IF iStep = 0 THEN 
     ELSIF... 
     END; 
END; 

其記錄在索引失敗

通過使用bulk_exceptions光標:

PROCEDURE .. 
    PRAGMA EXCEPTION_INIT(dml_errors, -24381); 
    l_errors   NUMBER; 
    iStep NUMBER; 
BEGIN 
    -- busines logic 
    iStep := 0; 
    FORALL TABLE_1 do delete; 
    iStep := 1; 
    FORALL TABLE_1 do update; 
    iStep := 2; 
    FORALL TABLE_1 do insert; 
    iStep := 3; 
    FORALL TABLE_2 do insert; 
    iStep := 4; 
    FORALL TABLE_2 do update; 
    iStep := 5; 
    FORALL TABLE_2 do insert; 
EXCEPTION 
    WHEN dml_errors then 

     FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE('Error #' || i || ' occurred during '|| 
      'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX); 
      DBMS_OUTPUT.PUT_LINE('Error message is ' || 
      SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); 
     END LOOP; 

     IF iStep = 0 THEN 
     ELSIF... 
     END; 
END; 
+0

你能在你的異常,如果else塊解釋ISTEP。 how/wat在那裏執行 –

+0

iStep值在每個循環後發生更改,因此您知道它在哪裏崩潰。 if/else如果沒有必要,我把它放在那裏給你一個想法,但我不知道你爲什麼想要做。你可以顯示(dbms_output.put_line)這一步。 – Sebas