AUTONOMOUS_TRANSACTIONプラグマを使用すると自律型のトランザクションを定義できます。
このトランザクションは、メイントランザクションと独立しているので、サブプロシージャないの処理を確実にコミットすることができます。
PL/SQLでログテーブルに書き込むときなどに使えるのではないでしょうか。
例
この無名PL/SQLは、innerサブプロシージャが自律型のトランザクションとなっています。
自律型トランザクション部分のtest1へのinsert処理は必ずコミットされます。
メイントランザクションではロールバックされるので、testへのinsertは取り消されます。
declare
procedure inner
is
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into test1 values ('1');
commit;
end;
begin
insert into test values ('1');
inner;
rollback;
end;
/
実行前
test、test1ともテーブルは空です。
10:22:39 SQL> select * from test;
no rows selected
Elapsed: 00:00:00.00
10:27:56 SQL> select * from test1;
no rows selected
実行
10:27:43 SQL> r
1 declare
2 procedure inner
3 is
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 begin
6 insert into test1 values ('1');
7 commit;
8 end;
9 begin
10 insert into test values ('1');
11 inner;
12 rollback;
13* end;
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.04
10:28:07 SQL>
実行後
自律型トランザクションのtest1だけinsertされていることがわかる。
10:28:01 SQL> select * from test;
no rows selected
Elapsed: 00:00:00.00
10:28:21 SQL> select * from test1;
C
-
1
Elapsed: 00:00:00.00
10:28:25 SQL>