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

Oracleストアドプロシージャにエラーメッセージを記録する

    独自のログをロールしてテーブルにログインする場合は、自律トランザクションを実行できます。 ルート。

    自律型トランザクションは、現在のトランザクションとは関係なくコミットできるトランザクションです。

    これにより、ストアドプロシージャまたはバッチプロセスの親トランザクションの成功または失敗に関係なく、必要なすべての情報をログテーブルに記録してコミットできます。

    CREATE OR REPLACE PROCEDURE "SP_LOG" (
        P_MESSAGE_TEXT VARCHAR2
    ) IS
      pragma autonomous_transaction;
    BEGIN
    
        DBMS_OUTPUT.PUT_LINE(P_MESSAGE_TEXT);
    
        INSERT INTO PROCESSING_LOG (
            MESSAGE_DATE,
            MESSAGE_TEXT
        ) VALUES (
            SYSDATE,
            P_MESSAGE_TEXT
        );
        COMMIT;
    
    END;
    /
    

    次に、このように呼び出すと、障害が発生してトランザクションをロールバックした場合でも、ログテーブルにメッセージをコミットできます。

    BEGIN
      SP_LOG('Starting task 1 of 2');
    
      ... code for task 1 ...
    
      SP_LOG('Starting task 2 of 2');
    
      ... code for task 2 ...
    
      SP_LOG('Ending Tasks');
    
      ... determine success or failure of process and commit or rollback ... 
    
     ROLLBACK;
    END;
    /
    

    コードにとって意味のある例外を除いて整理することもできますが、それは一般的な考え方であり、SP_LOGの呼び出しで書き込まれたデータは保持されますが、親トランザクションはロールバックできます。



    1. PostgreSQL RDSは、dblink_connect()を使用するときに接続パスワードをハードコーディングしないようにします

    2. SQLServerで一重引用符をエスケープする

    3. MySQLは2つの#/複数のペアの#の間で文字列を取得します

    4. pqxx再利用/作業トランザクションの再アクティブ化