自律型トランザクションを利用する(Oracleメモ)

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
Last-modified: 2009-06-11 (木) 00:48:55 (3749d)