特定のOracle例外のみをキャッチして処理する方法


20

この、この私は、ORA-00955のための事前定義された名前付きシステム例外がないことを、推測します。

エラーORA-00955のみをキャッチするために次のように書き直すにはどうすればよいですか?

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;

ところで、エラーコードを提供するだけでエラーをキャッチする構文はありますか?

回答:


33

次の2つのオプションがあります。


例外を番号で直接参照します。

BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE = -955 THEN
        NULL; -- suppresses ORA-00955 exception
      ELSE
         RAISE;
      END IF;
END; 

他のオプションは、EXCEPTION_INITPragmaディレクティブを使用して、既知のOracleエラー番号をユーザー定義の例外にバインドすることです。

DECLARE
   name_in_use exception; --declare a user defined exception
   pragma exception_init( name_in_use, -955 ); --bind the error code to the above 
BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    when name_in_use then
       null; --suppress ORA-00955 exception
END; 

ところで、エラーコードを提供するだけでエラーをキャッチする構文はありますか?

はい、最初の例で説明しました

これに関するバリエーションの詳細:


1
他の人がラインを上げるとき、私はただ行くことができませんか?
bernd_k

@bernd_kはい、あなたはそれを行う、それはしかし、未処理の例外として行く
Sathyajith Bhatさん

2
sqlcodeが955でない場合は、WHEN OTHERSにレイズを追加してください=)
ビンセントマルグラット

OPは、他のエラーを発生させたい場合があります。「現状のまま」の例外ブロックは、WHEN OTHERS THEN NULLとまったく同じように動作します。OPはもう少し正確で微妙なものを望んでいると思います。
ビンセントマルグラット

@VincentMalgratあなたは正しいです。
サティアジスバート

5

Sathyaがすでに提案したものと似ていますが、when others可能な限り完全に回避したいです-未処理の例外は、通常、特に処理していない例外の正しい結果です。

create sequence foo;
/*
sequence FOO created.
*/
declare
  name_is_already_used_955 exception;
  pragma exception_init(name_is_already_used_955,-955);
begin
  execute immediate 'create sequence foo';
exception when name_is_already_used_955 then null;
end;
/
/*
anonymous block completed
*/

それはまさにサティアスの提案から凝縮したものです。
bernd_k
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.