【PL/SQL】自律型トランザクションのすゝめ

2020年7月27日

いきなりですが、「自律型トランザクション」とは!?
処理中にテーブルを使用した採番や、テーブルにエラー内容を出力と言った事をやりたいな~と思う事があります。
あるはずです!
特にメイン処理でエラーが発生して「ROLLBACK」すると、テーブルに出力したエラー内容まで消えてしまいます。
採番の例で説明していきます。

採番の例

採番 FUNCTION を作成

CREATE OR REPLACE FUNCTION SAIBAN IS
    PRAGMA AUTONOMOUS_TRANSACTION; -- ←自律型トランザクションの指定(プラグマ)
    L_AAA SEQTBL.AAA%TYPE;
BEGIN
    UPDATE SEQTBL SET
        AAA = AAA + 1
     WHERE (BBB = 'B')
 RETURNING AAA INTO L_AAA;
 
    COMMIT; -- ←自律型トランザクションではトランザクションを終了させないとエラーとなります
 
    RETURN(L_AAA);
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END SAIBAN;

メイン処理の作成

DECLARE
    L_SEQNO SEQTBL.AAA%TYPE;
    L_TEST NUMBER(10);
BEGIN
    INSERT INTO TSTBL1(BBB) VALUES(1); --(1)
 
    L_SEQNO := SAIBAN; --(2) 採番テーブルから番号取得
 
    UPDATE TSTBL2 SET --(3)
        DDD = L_SEQNO
     WHERE (CCC = 'AAA');
 
    L_TEST := 1 / 0; --(4) 0除算でエラー発生
 
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK; --(5)
        RAISE; --(6)
END;

少し長く見えますが順に説明して行きます。
メイン処理の流れは以下となります。

  • (1)「TSTBL1」テーブルに値をINSERT
  • (2)「SAIBAN」FUNCTIONを呼び出し、採番値取得
  • (3)「TSTBL2」テーブルの値をUPDATE
  • (4)「0除算」でシステムエラー発生
  • (5) ROLLBACK
  • (6) RAISE で呼び元にエラーを返して処理終了

(5)で「ROLLBACK」されますが、
通常の場合、「SAIBAN」FUNCTIONの中で「COMMIT」を発行している為、
(1)の「INSERT」もCOMMITされてしまいます。
でも、上記のロジックの場合、そうはなりません。
「SAIBAN」の中で、「PRAGMA AUTONOMOUS_TRANSACTION」が指定されているので、このFUNCTIONのトランザクションは自律(独立)しています。メイン処理のトランザクションとは別となります。
結果として、
「TSTBL1」、「TSTBL2」はROLLBACKされ、「SEQTBL」は更新されます。

【PL/SQL】メニュー

サイトマップ

2020年7月27日Oracle,PL/SQL,データベース,プログラム

Posted by こっぷ