pl/sqlの例外処理をスマートに書きたい

ログ出力のための仕組みを簡単に作成したので、今度は例外が発生したときの試行錯誤。
例外を取り扱うのも、いちいちルールを決めて個別のコードでたくさん記載するのは面倒だし、TYPEとpackageで何とか簡単にできないかなということで記載してみた。

例外の情報を格納するためのTYPEを作る。

/*----------------------------
 TYPE宣言
-----------------------------*/
--例外基本オブジェクト
CREATE OR REPLACE TYPE excep_typ AS OBJECT
 (
      EXP_CODE     number(5),
      EXP_MSG      varchar2(2048),
      EXP_PRG      varchar2(50),
      EXP_ERRSTACK varchar2(2000)
 ) NOT final;
/

エラー発生のコードとメッセージ、エラー発生場所、後はあればスタック情報を保持する。

これを生成したりするpackageはこんな感じ。

CREATE OR REPLACE PACKAGE BODY excep IS

 PROCEDURE e_catch IS
     my_excep excep_typ;
 BEGIN
     --excepオブジェクトを作成し、ログへ記録する
     my_excep := excep_typ(NULL,NULL,NULL,NULL);
     my_excep.EXP_CODE := SQLCODE;
     my_excep.EXP_MSG  := substrb(SQLERRM, 1,2048);     
     --例外の発生したモジュール名を取得
     my_excep.EXP_PRG  := substrb(utl.get_caller_name, 1,50);
     my_excep.EXP_ERRSTACK := substrb(dbms_utility.format_error_stack, 1,2000);

     logger.write( my_excep );                 --Oracleの例外はログ記録させた方がいいだろう。

   EXCEPTION
     WHEN OTHERS THEN
              DBMS_OUTPUT.PUT_LINE(SQLERRM);
 END;
 

e_cacheというプロシジャでオブジェクトを生成し例外のコードやらメッセージを取得してセットしている。また、この時に自動的にログ出力されるようにloggerへexceptionオブジェクトを渡している。

プログラムからはexceptionのところに以下のように記載。

EXCEPTION
    WHEN OTHERS THEN
             excep.e_catch;

この一行で、例外のコードを取得し、ログへ自動的に記録する。後はお好みでやればいい。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。