2016-04-19 10 views
0

ORA-000942の例外を処理したいと思いますが、これに続くmanualおよびこのdiscussionに従います。これには事前に定義された名前を持つORA-エラーですので、私はこのコードを実行すると、私はORA-000942メッセージを取得していきますが、プロシージャ・レベル・ハンドラを経由して期待できないようexception_init.Oracle:EXCEPTION_INITを使用した特定のOracleメッセージのキャプチャ

を使用します。

create table foobar (foobar_id varchar(1)); 

declare 

procedure p_add_to_foobar 
is 
p_missing_table exception; 
pragma exception_init(p_missing_table, -00942); 

begin 
insert into foobaz 
select '1' from dual; 

    exception 
    when p_missing_table then 
    dbms_output.put_line('MISSING TABLE'); 
    end p_add_to_foobar; 


begin 
p_add_to_foobar; 
dbms_output.put_line('DONE'); 
end; 

質問:

  1. 私は私のプロシージャ・レベルの例外が-942エラーを処理するために取得するにはどうすればよいですか?それはもちろんfoobazテーブルが存在しないため、ステートメントに

    insert into foobaz 
        select 1 from dual 
    

    をコンパイルしようとすると

答えて

4

あなたが取得しているエラーは、PL/SQLコンパイラによってスローされています。インラインSQL文はコンパイル時に有効でなければならず、したがってコンパイラは例外をスローします。

あなたはのように、動的SQLを使用する必要がありますこれを回避するには、次の運のベスト

MISSING TABLE 
DONE 

declare 
procedure p_add_to_foobar is 
    p_missing_table exception; 
    pragma exception_init(p_missing_table, -00942); 
begin 
    EXECUTE IMMEDIATE 
    'insert into foobaz 
     select ''1'' from dual'; 
    exception 
    when p_missing_table then 
     dbms_output.put_line('MISSING TABLE'); 
    end p_add_to_foobar; 
BEGIN 
    p_add_to_foobar; 
    dbms_output.put_line('DONE'); 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('WHEN OTHERS: ' || SQLERRM); 
END; 

は、上記の予想される出力を生成します。

+0

はい、実行する前にコンパイルに失敗します –

関連する問題