2017-09-13 5 views
0

私のプログラムに2つのネストされたブロックがあります。最初のネストされたブロックでエラーが発生すると、プログラムはそれ以上実行されず、例外セクションに進み、プログラム全体を終了します。 しかし私は自分のプログラムを終了したくありません。私のプログラムは、2番目のネストしたブロックに対して実行する必要があります。さらに、1番目のネストされたブロックでも例外が発生します。私はこのようなプログラムがある場合はネストされたブロックで例外をスキップする方法

は:私のプログラムのinner1ブロックに

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; 

をので、全体的なプログラムが実行されませんvalue error exceptionがスローされます。

inner1ブロックで発生した例外でさえ、inner2とouterブロックをどのように実行しますか?

答えて

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

ありがとう@ウィリアム。一部の非識字人は私の質問に投票して、PL/SQLでは不可能だと言いました。 –

関連する問題