2016-05-11 8 views
0

私の手続きです。Oracleプロシージャログイベント

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
    IS 
BEGIN 

    INSERT INTO PROC_LOG (START_DATE,OUTPUT) VALUES (sysdate,Process Started); 

    INSERT INTO NDB_AML_CUSTOMER 
    (ID, TITLE,...) 
    SELECT ID, TITLE,... 
    FROM NDB_CUSTOMER_NEW 
    WHERE DATE_TIME > (SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'); 

    UPDATE CHECK_POINT SET RUN_DATE = SYSDATE WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'; 

    COMMIT; 

    INSERT INTO PROC_LOG (END_DATE,OUTPUT) VALUES (sysdate,Process Ended); 

END; 
/

ログイベントをテーブルに出力したいとします。このように、開始日は&と呼ばれ、「プロセスが開始されました」と呼ばれ、プロセス終了日は&です。例外時にエラーメッセージが表示されます。 Log_table、開始日、終了日の3つの列&出力。専門家からのインプットを探しています。

+2

ロギングプロシージャは、通常、トランザクション全体をロールバックする必要があるときにロールバックされないようにするために、 'pragma autonomous transaction'を使用します。彼らはトランザクション全体をコミットしません。それ以外の場合は、あなたの質問は何ですか? –

+0

プロシージャ内のイベントを処理したい、プロシージャの実行が開始されたとき、終了したとき、例外でエラーメッセージがあったときなど。ソース表名のような例外では、プロシージャーはレコードをまったく選択しないため、ロールバックは必要ありません。 –

答えて

1

この記事で説明した手順で例外を検出することができますException handling。開始日と終了日を記録するには、単純なinsert文を使用します。

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
    IS 
BEGIN 

    Process start event 

INSERT INTO LOG_TABLE(ID, START_DATE, END_DATE, MESSAGE) VALUES (ID, SYSDATE, NULL, NULL); 

    INSERT INTO NDB_AML_CUSTOMER 
    (ID, TITLE,...) 
    SELECT ID, TITLE,... 
    FROM NDB_CUSTOMER_NEW 
    WHERE DATE_TIME > (SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'); 

    UPDATE CHECK_POINT SET RUN_DATE = SYSDATE WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'; 

    COMMIT; 
    UPDATE LOG_TABLE SET END_DATE = SYSDATE WHERE ID = ID; 
    Process End event 

EXCEPTION 

WHEN OTHERS THEN 
UPDATE LOG_TABLE SET END_DATE = SYSDATE, MESSAGE = EXCEPTION_MESSAGE WHERE ID = ID; 

END; 

このスニペット

+0

UPDATEステートメントでは、ID = IDは? –

+0

名前はちょっと混乱して申し訳ありませんでした。最初のIDはフィールド、2番目のIDは値です。適切な更新ステートメントを取得するには、一意の識別子が必要です。 – ZeusNet

0

のようないくつかのものは、セッションが何をしているかを見ることができるように、私は(pragma autonomous transactionを使用して)私のログテーブルにメッセージを出力し、別のプロセスロギングパッケージを持っているだけでなく、DBMS_APPLICATION_INFOを使用してv $ sessionを照会するとき。

パッケージ情報、ログメッセージの種類(情報、エラーなど)を渡す実際のコードパッケージには、ラッパープロシージャがあります。

ティム氏の目に見えるロギングパッケージの例があるので、https://oracle-base.com/articles/misc/instrumenting-your-plsql-codeをお勧めします。