SQL*Plus を終了する際に実行中のトランザクションを制御する方法について記述しています。
SQL*Plus の設定
COMMIT 文や ROLLBACK 文を実行する以外に、SQL*Plus にはトランザクションの制御を行う設定がいくつかあります。
自動コミット
AUTOCOMMIT システム変数を ON に変更すると、INSERT/DELETE/UPDATE 文が正常に実行されると直ちにコミットされます。デフォルト値は OFF です。
終了時のコミット
SQL*Plus 終了時に実行中のトランザクションをコミットするかロールバックを行うかを設定するシステム変数があります。EXITCOMMIT システム変数を OFF に設定すると、SQL*Plus 終了時にロールバックが実行されます。デフォルトは 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との接続が切断されました。
$
エラー発生時の設定
SQL*Plus 内でエラーが発生した時に自動的的に SQL*Plus を終了する場合は 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