pl/sqlのログをファイルへも出力

前に作ったpl/sqlのログ出力オブジェクトにファイル出力タイプを追加してみる。

ログ出力は今まで、DBMS_OUTPUTを基本にそれを継承したTABLE書き込み型を用意してきたが、今回のファイル出力型も継承を使って実装する。

------------------------------------
-- logger_file_typ
-- ファイル出力型
------------------------------------
CREATE OR REPLACE TYPE logger_file_typ UNDER logger_typ
 (
     OVERRIDING MEMBER PROCEDURE write( MSG IN logmsg_typ )
 ) NOT final;
/

CREATE OR REPLACE TYPE BODY logger_file_typ AS
    OVERRIDING MEMBER PROCEDURE write( MSG IN logmsg_typ ) IS
        FH UTL_FILE.FILE_TYPE;    --ファイルハンドラ
        v_DIR  varchar2(1000);
        v_FILE varchar2(1000);
 BEGIN
        v_DIR :=  cb.GET_CONFIG_VALUE('APL_LOG_DIR');
        v_FILE := cb.GET_CONFIG_VALUE('APL_LOG_FILE');
        IF v_DIR is NULL or v_FILE is NULL THEN RETURN; END IF;

 -- ファイルOPEN
        FH := UTL_FILE.FOPEN( v_DIR,
                                        v_FILE,
                                        'A',
                                        32767);

        UTL_FILE.PUT_LINE(FH,
                                  MSG.LOG_DATE   || ' ' ||
                                  MSG.LOG_LEVEL  || ' ' ||
                                  MSG.LOG_MSG    || ' ' ||
                                  MSG.LOG_HOST   || ' ' ||
                                  MSG.LOG_OSUSER || ' ' ||
                                  MSG.LOG_PRG    || ' ' ||
                                  MSG.LOG_SUPPLE );
        UTL_FILE.FCLOSE(FH);

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

これでファイル出力型のオブジェクトは完成。プログラム側は変更すること無く出力先を切り替えることができる。

ディレクトリ名とファイル名の取得にcb.GET_CONFIG_VALUEを使っているが、これは自前のパッケージでコンフィグ情報から値を取り出すもの。

それにしても、OracleのUTL_FILEは面倒だ。以前のバージョンだと初期化パラメータファイルにUTL_FILE_DIRを指定して、FOPENでは許可されたディレクトリ名を記載する仕様だが、最近のはCREATE DIRECTORYで指定する。(UTL_FILE_DIRも使えるが。)その場合にはFOPENにはCREATE DIRECTORYで作成したディレクトリ名を指定しなければならない。勘違いして本当のディレクトリパスを書いてしまうと、ORA-29280: 無効なディレクトリ・パスです。と怒られる。これが紛らわしい。

広告

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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