2013-07-21 44 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