2017-09-13 162 views
0

我的程序中有2個嵌套塊。如果在第一個嵌套塊中發生任何錯誤,那麼程序將不會繼續執行,它將轉到異常部分並退出整個程序。 但我不想退出我的計劃。我的程序需要爲第二個嵌套塊執行,而且,即使在第一個嵌套塊中引發異常。如何跳過嵌套塊中的異常

如果我有這樣的程序:

DECLARE 
    var_out VARCHAR2(10):= 'OUTER'; 
BEGIN 
    <<INNER1>> 
    DECLARE 
     var_in1 NUMBER:='INNER 1'; 
    BEGIN 
     DBMS_OUTPUT.PUT_LINE(var_in1); 
    EXCEPTION 
     WHEN OTHERS THEN 
      DBMS_OUTPUT.PUT_LINE(SQLERRM); 
    END; 

    <<INNER2>> 
    DECLARE 
     var_in2 VARCHAR2(10):='INNER 2'; 
    BEGIN 
     DBMS_OUTPUT.PUT_LINE(var_in2); 
    EXCEPTION 
     WHEN OTHERS THEN 
      DBMS_OUTPUT.PUT_LINE(SQLERRM); 
    END; 
    DBMS_OUTPUT.PUT_LINE(var_out); 
EXCEPTION 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE(SQLERRM); 
END; 
在我的計劃inner1塊

將拋出value error exception所以總體方案將不被執行。

如何執行inner2和outer block,甚至在inner1塊中引發異常?

回答

0

由於INNER1中的異常發生在聲明部分內,因此超出了該塊的異常處理程序的範圍。您需要用其自己的異常處理程序將整個INNER1塊包裝到另一個塊中。

declare 
    var_out varchar2(10):= 'OUTER'; 
begin 
    <<INNER1>> 
    begin 
     declare 
      var_in1 number:='INNER 1'; 
     begin 
      dbms_output.put_line(var_in1); 
     exception 
      when others then 
       dbms_output.put_line('Error in innermost INNER1'); 
     end; 
    exception 
     when others then 
      dbms_output.put_line('Error in INNER1 wrapper'); 
    end; 

    <<INNER2>> 
    declare 
     var_in2 varchar2(10):='INNER 2'; 
    begin 
     dbms_output.put_line(var_in2); 
    exception 
     when others then 
      dbms_output.put_line('Error in INNER2'); 
    end; 
    dbms_output.put_line(var_out); 
exception 
    when others then 
     dbms_output.put_line('Error at top level'); 
end; 

輸出:可能不需要

Error in INNER1 wrapper 
INNER 2 
OUTER 

OTHERS搬運車 - 上面的僅僅是爲了說明的結構。

+0

謝謝@william。一些不識字的人被投下我的問題,並表示,這在PL/SQL中是不可能的。 –