sql >> データベース >  >> RDS >> Oracle

OracleAutonomousTransactionの例

    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の一括収集と例外の保存の例
    1. Pythonを使用してMySQLに接続する方法

    2. MySQLに固執する10の理由

    3. SQLケース:3つのあまり知られていない面倒を知って回避する

    4. SQLServerのGroupBy、Having、Where句の実行シーケンス?