はじめに
スクリプトの処理中にエラーが発生した場合、スクリプトの後続の処理を実行させない方法をご紹介します。vsqlのデフォルトの設定では、スクリプトの途中でエラーが発生してもスクリプトの最後まで処理を行います。
もしエラー以降の処理を実行させたくない場合、vsqlで”ON_ERROR_STOP”に”on”を設定することでエラー以降の処理を実行させないことができます。
コマンド構文
vsqlで”ON_ERROR_STOP”の設定を行います。[設定]
\set ON_ERROR_STOP on
[解除]
\set ON_ERROR_STOP off
補足
“ON_ERROR_STOP”の設定によって以下の違いもあります。・”ON_ERROR_STOP”に”on”を設定している場合は、スクリプトのエラーで終了コードに”3″が設定されます。
・”ON_ERROR_STOP”に”on”を設定していない場合は、スクリプトのエラーで終了コードに”0″(正常)が設定されます。
利用例
例えば、UPDATE、INSERT、DELETE、COMMITの処理が含まれたスクリプトがあります。スクリプトの先頭で”ON_ERROR_STOP”にonを設定して、スクリプトでエラーが発生した場合、それ以降の処理は行わずにロールバックして終了します。
(1)vsqlで実行するスクリプト
1 2 3 4 5 6 7 |
$ cat test1.sql \set ON_ERROR_STOP on <=== ★"ON_ERROR_STOP"にonを設定します。 update tbl set col1 = 9 where col1 = 3; insert into tbl values(1,1); <=== ★重複キーのエラーが発生するINSERTです。 delete from tbl where col1 = 2; commit; |
(2)テーブルのデータを確認
1 2 3 4 5 6 7 |
dbadmin=> select * from tbl; col1 | col2 ------+------ 1 | AAA 2 | BBB 3 | CCC (3 rows) |
(3)Verticaに接続してスクリプトを実行
UPDATEは実行されますがINSERTで重複エラーが発生し、それ以降の処理は行われません。
1 2 3 4 5 6 7 8 9 10 |
$ vsql -e -w xxx -f 'test1.sql' update tbl set col1 = 9 where col1 = 3; OUTPUT -------- 1 (1 row) insert into tbl values(1,1); <=== ★INSERTで重複キーエラーが発生しています。 vsql:test1.sql:4: ERROR 6745: Duplicate key values: 'col1=1' -- violates constraint 'public.tbl.C_PRIMARY' |
(4)終了コードを確認
スクリプトの実行でエラーが発生したため、終了コードが”3″になります。
1 2 |
$ echo $? 3 |
(5)テーブルのデータを確認
スクリプト実行の前後でデータは同じで更新はされていません。
1 2 3 4 5 6 7 |
dbadmin=> select * from tbl; col1 | col2 ------+------ 1 | AAA 2 | BBB 3 | CCC (3 rows) |