[ Oracle PL/SQL ] ユーザーの独自例外の発生と捕捉 ( raise_application_error / EXCEPTION_INIT )

Pocket

ORA-00600: 内部エラー・コード・・・」 のようにOracle で定義されているエラーだけでなく ユーザーが独自にエラー番号を定義して例外を発生させるサンプルを掲載しています。

スポンサーリンク

ユーザーが定義できる番号は 「ORA-20000~ORA-20999」のようです。色々なパッケージなどでも独自でエラー番号を定義して使用していると思いますので、重複したりするかもしれません。

ユーザの独自例外の発生
CREATE OR REPLACE PROCEDURE TEST_PROC(userId VARCHAR2)
IS
BEGIN
    -- 特定の場合のみ例外を発生させる
    if(userId = '0010') then 
       
       -- 例外番号 -20500 のOracle例外を発生させる
       raise_application_error(-20500, '何度いったらわかるの?もう来ないでください。');

    else 

       -- 何もしない
       null;

    end if;
END;
/

上記のプロシージャを呼び出すと、例外が発生します。

ORA-20500: 何度いったらわかるの?もう来ないでください。

今までORA-(ハイフン)番号かと思っていましたが、ハイフンではなく、マイナスのようですね。ただ、それだけですが。

独自に定義した例外を捕捉 ( キャッチ ) する

例外を発生させることができるならば、捕捉することもできます。独自定義した例外を捕捉するサンプルです。詳細はコメントを参照ください。

CREATE OR REPLACE PROCEDURE TEST_PROC(userId VARCHAR2)
IS
    /*
     * 捕捉するための例外変数の定義し、
     * 独自の例外番号との紐付けを行う
     */
    personalBlockException EXCEPTION;
    PRAGMA EXCEPTION_INIT(personalBlockException, -20500);

BEGIN

  BEGIN

    if(userId = '0010') then 
       
       -- 例外番号 -20500 のOracle例外を発生させる
       raise_application_error(-20500, 'ユーはお断り');

    else 

       -- 何もしない
       null;

    end if;

  EXCEPTION
    WHEN personalBlockException THEN  -- ORA-20500 を捕捉する

        dbms_output.put_line('エラーコード    : ' || sqlcode);
        dbms_output.put_line('エラーメッセージ: ' || sqlerrm);
      
    /*
     * エラーコード    : -20500
     * エラーメッセージ: ORA-20500: ユーはお断り
     */

  END;
END;
/

 

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>