2017-05-31 21 views
0

ID、重大度、メッセージ、ログ日時のmessage_logテーブルを持っています&時刻。oracle plsqlのステップ・バイ・ステップ・ロギング

以下の手順を使用して、PL/SQLスクリプトのログ・テーブルにログ・メッセージを挿入します。

add_log(ID,'START','DEBUG','No CDR Detail to be processed', sysdate);  

しかし、失敗した場合、メッセージが記録されないことがあります。 plsqlの進捗状況を段階的に記録する最良の方法は何ですか(必要に応じて障害点まで)。

create or replace procedure add_log 
     (stp varchar2, code varchar2, log_message varchar2, logdat date) 
    is 

begin 

    insert into message_log 
    (SEQ,PROC_STEP, 
    CODE, 
    LOG_MESSAGE, 
    LOG_DATE 
    ) 
    values 
    (log_SEQ.NEXTVAL,stp,code,log_message,logdat) 
    ; 

end; 
+1

PLSQLスクリプトで適切な '例外処理 'を使用し、メッセージをログに挿入するのに利用します。 – Utsav

+0

'add_log'プロシージャでトランザクションをコミットするのか、PL/SQLブロックでadd_logをコールしたのですか? – user75ponic

答えて

1

「私はいくつかのメッセージが表示されない障害が発生した場合には、ログインしてきています。(必要に応じて、障害箇所まで)PLSQLの進行の段階の進捗バイステップのログを記録するための最良の方法は何ですか。」

ADD_LOG()プロシージャにはcommitが含まれていません。おそらく、より広いトランザクションを使用してログ・レコードを永続化していると思われます。この問題は、より広範なトランザクションが失敗した場合、ロールバックしてログメッセージを取り込みます。

これは、自律型トランザクションプラグマのほんの正当な用途の1つです。これにより、外部トランザクションに影響を与えることなくコミットできるように、孤立したトランザクション(ネストされたセッション)が作成されます。

create or replace procedure add_log (stp varchar2, code varchar2, log_message varchar2, logdat date) 
is 
    PRAGMA AUTONOMOUS_TRANSACTION; 
begin 
    insert into message_log 
    (SEQ,PROC_STEP, 
    CODE, 
    LOG_MESSAGE, 
    LOG_DATE 
    ) 
    values 
    (log_SEQ.NEXTVAL,stp,code,log_message,logdat) 
    ; 
    COMMIT; 
end; 

この変更をADD_LOG()に設定すると、呼び出し元のトランザクションに関係なく、すべてのメッセージがコミットされます。

関連する問題