SQL*Plusを終了する際に実行中のトランザクションを制御する方法について記述しています。
SQL*Plusの設定
COMMIT文やROLLBACK文を実行する以外に、SQL*Plusにはトランザクションの制御を行う設定がいくつかあります。
自動コミット
AUTOCOMMIT システム変数をONに変更すると、INSERT/DELETE/UPDATE文が正常に実行されると直ちにコミットされます。デフォルト値はOFFです。
終了時のコミット
SQLPlus終了時に実行中のトランザクションをコミットするかロールバックを行うかを設定するシステム変数があります。EXITCOMMITシステム変数をOFFに設定すると、SQLPlus終了時にロールバックが実行されます。デフォルトはONで、SQL*Plus終了時に自動的にトランザクションがコミットされます。
SQL> SHOW EXITCOMMIT
exitcommit ON
SQL> SHOW AUTOCOMMIT
autocommit OFF
SQL>
EXITコマンドの指定
SQL*Plusを終了する際にはEXITコマンドを実行します。EXITコマンドにCOMMITまたはROLLBACKを指定すると、システム変数EXITCOMMITの値を上書きできます。指定しない場合にはシステム変数EXITCOMMITの値に従います。
SQL> EXIT COMMIT
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0との接続が切断されました。
$
エラー発生時の設定
SQLPlus内でエラーが発生した時に自動的的にSQLPlusを終了する場合はWHENEVER SQLERRORコマンドまたはWHENEVER OSERRORコマンドにEXIT句を指定します。
EXIT句に更にCOMMITまたはROLLBACK句を指定しない場合、システム変数EXITCOMMITの値が使われます。下記の例ではSQL文のエラーが発生した場合にはSQL*Plusを終了し、実行中のトランザクションは強制的にロールバックします。
SQL> WHENEVER SQLERROR EXIT ROLLBACK;
SQL> INSERT INTO data1 VALUES (0, 'SUCCESS');
1 row created.
SQL> INSERT INTO data1 VALUES (0, 'FAIL');
INSERT INTO data1 VALUES (0, 'FAIL')
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.PK_DATA1) violated
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0
$ echo $?
0