3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQL*Plus終了時のトランザクションを制御する(Oracle Database 19c)

Last updated at Posted at 2020-08-04

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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?