Oracleでは、自律型トランザクションは、メイントランザクションでコミットまたはロールバックすることなく、同じセッションでデータをコミットまたはロールバックできます。 PRAGMA(コンパイラ指令)ステートメントは、Oracleで自律トランザクションを定義するために使用されます。以下は、Oracleの自律トランザクションの例です。
Oracleで自律トランザクションを定義する構文
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
自律型トランザクションのOracleストアドプロシージャの例
自律トランザクションに関する次のOracleストアド・プロシージャは、PL / SQLプログラム(プロシージャ、パッケージ、関数など)で発生したエラーをログに記録するためのものです。エラー情報を表error_logに挿入し、PL/SQLプログラムのメイントランザクションに影響を与えることなくデータをコミットします。 PL / SQLプログラムからこのプロシージャを呼び出して、エラー情報をログに記録できます。以下にその方法を示します。システムでテストする次のオブジェクトを作成します。
テーブルError_Logの作成
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
エラーをログに記録する自律トランザクションのOracleストアドプロシージャ
以下のプロシージャは3つのパラメータを取ります。これらのパラメータは、エラー時に他のストアドプロシージャまたは関数からプロシージャを呼び出すときに渡す必要があります。
CREATE OR REPLACE PROCEDURE prc_log_errors (v_error_code IN VARCHAR2, v_error_msg IN VARCHAR2, v_plsql_program IN VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO error_log (ERROR_CODE, ERROR_MSG, DATE_OCCURRED, PLSQL_PROGRAM_REF) VALUES (v_error_code, v_error_msg, SYSDATE, v_plsql_program); COMMIT; END; /
これで、ストアドプロシージャを呼び出すことができます prc_log_errors 他のPL/SQLプログラムの例外処理セクションから、エラー情報をログに記録します。次に例を示します:
テーブルtest_dataの作成
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
関数fnc_testの作成
次の関数は、いくつかのデータを test_dataに挿入します テーブル、そしてその後、次の行で0で除算しているため、エラーが生成されます。エラーの場合、例外セクションで、プロシージャ prc_log_errorsを呼び出しています。 エラーをログに記録します。関数がエラーなしで実行された場合はTRUEを返し、そうでない場合はFALSEを返します。以下の場合、エラーをログに記録した後、FALSEが返されます。
CREATE OR REPLACE FUNCTION fnc_test RETURN BOOLEAN IS n NUMBER; BEGIN INSERT INTO test_data VALUES ('abc'); /* generate error */ n := 2 / 0; RETURN TRUE; EXCEPTION WHEN OTHERS THEN prc_log_errors (TO_CHAR (SQLCODE), SQLERRM, 'FNC_TEST'); RETURN FALSE; END fnc_test; /
テスト
上記の関数を呼び出しますfnc_test 。
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
失敗時にロールバックしている場合でも、手順prc_log_errors があるため、データはerror_logテーブルに保存されます。 PRAGMA AUTONOMOUS_TRANSACTIONを使用しています 。
test_dataテーブルを確認してください。レコードがないはずです。
SELECT * FROM test_data;
出力
no rows selected.
error_logテーブルのデータを確認してください
SELECT * FROM error_log;
出力
ERROR_CODE ERROR_MSG DATE_OCCURRED PLSQL_PROGRAM_REF -1476 ORA-01476: divisor is equal to zero 27/03/2019 15:43:12 FNC_TEST
関連項目:
- Oracle PL/SQLの一括収集と例外の保存の例