** 自律型トランザクションを利用する(Oracle) [#w5c041f0]
** 自律型トランザクションを利用する([[Oracleメモ]]) [#w5c041f0]
#setlinebreak(on);

PRAGMA AUTONOMOUS_TRANSACTION を使用すると
プロシージャ等で自律型トランザクションを利用する事ができる。

(1)前準備
 CREATE TABLE T_TEST1 (COL1 VARCHAR2(10));
 CREATE TABLE T_TEST2 (COL1 VARCHAR2(10));

(2)自律型トランザクションのプロシージャを作成
 CREATE OR REPLACE PROCEDURE TEST_PROC AS 
 	PRAGMA AUTONOMOUS_TRANSACTION;
 BEGIN
 
 	INSERT INTO T_TEST1(COL1) VALUES ('TEST');
 
 	EXECUTE IMMEDIATE 'ALTER TABLE T_TEST MODIFY COL1 VARCHAR2(30)';
 
 	ROLLBACK;
 
 END;
 /

(3)メイン処理の実行(TEST_PROCプロシージャの呼び出し)
 DECLARE
 	COL1 VARCHAR2(10);
 BEGIN
 	DBMS_OUTPUT.PUT_LINE('-- START --');
 	INSERT INTO T_TEST2(COL1) VALUES ('TEST');
 	TEST_PROC();
 	ROLLBACK;
 	DBMS_OUTPUT.PUT_LINE('--  END  --');
 END;
 /

(4)テーブルの内容を確認
 SELECT COUNT(*) FROM T_TEST1;
 SELECT COUNT(*) FROM T_TEST2;
 
 @orcl> SELECT COUNT(*) FROM T_TEST1;
 
   COUNT(*)
 ----------
          1
 
 @orcl> SELECT COUNT(*) FROM T_TEST2;
 
   COUNT(*)
 ----------
          0

TEST_PROCプロシージャ内でDDLを発行してしまっているので、
T_TEST1へのINSERTはCOMMITされてしまっているが、
呼び出し元(メイン処理)で行われたT_TEST2へのINSERTはきちんとROLLBACKされている。

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS