** 自律型トランザクションを利用する(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されている。