OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

vsqlで実行したスクリプトでエラーが発生した場合の制御方法

公開日:
更新日:
基本操作
#vsql

はじめに

スクリプトの処理中にエラーが発生した場合、スクリプトの後続の処理を実行させない方法をご紹介します。
vsqlのデフォルトの設定では、スクリプトの途中でエラーが発生してもスクリプトの最後まで処理を行います。
もしエラー以降の処理を実行させたくない場合、vsqlで”ON_ERROR_STOP”に”on”を設定することでエラー以降の処理を実行させないことができます。

コマンド構文

vsqlで”ON_ERROR_STOP”の設定を行います。

[設定]

\set ON_ERROR_STOP on

[解除]

\set ON_ERROR_STOP off

実行例

例えば、UPDATE、INSERT、DELETE、COMMITの処理が含まれたスクリプトがあります。スクリプトの先頭で”ON_ERROR_STOP”にonを設定して、スクリプトでエラーが発生した場合、それ以降の処理は行わずにロールバックして終了します。

(1)vsqlで実行するスクリプト

$ 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)テーブルのデータを確認

dbadmin=> select * from tbl;
 col1 | col2
------+------
    1 | AAA
    2 | BBB
    3 | CCC
(3 rows)

(3)Verticaに接続してスクリプトを実行
UPDATEは実行されますがINSERTで重複エラーが発生し、それ以降の処理は行われません。

$ 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″になります。

$ echo $?
3

(5)テーブルのデータを確認
スクリプト実行の前後でデータは同じで更新はされていません。

dbadmin=> select * from tbl;
 col1 | col2
------+------
    1 | AAA
    2 | BBB
    3 | CCC
(3 rows)

注意点

vsql -f オプションの実行結果は、“ON_ERROR_STOP”の設定によって、終了コードが違いあります。スクリプトで処理を制御する場合は、ご注意ください。

・”ON_ERROR_STOP”に”on”を設定した場合は、スクリプトのエラーで終了コード【3】が返されます。
・”ON_ERROR_STOP”に”on”を設定しない場合は、スクリプトのエラーで終了コード【0(正常)】が返されます。

ON_ERROR_STOP を設定しない場合の終了コード

$ cat test1.sql
-- \set ON_ERROR_STOP on <=== ★コメントアウトしています。

update tbl set col1 = 9 where col1 = 3;
insert into tbl values(1,1);
delete from tbl where col1 = 2;
commit;
$ vsql -e -w testdb -f 'test1.sql'
update tbl set col1 = 9 where col1 = 3;
 OUTPUT
--------
      0
(1 row)

insert into tbl values(1,1);
vsql:test1.sql:4: ERROR 6745:  Duplicate key values: 'col1=1' -- violates constraint 'public.tbl.PK_LINEORDER'
delete from tbl where col1 = 2;
 OUTPUT
--------
      0
(1 row)

commit;
COMMIT
$ echo $?
0 <=== ★「0」を返します。

参考情報

ON_ERROR_STOP
https://www.vertica.com/docs/12.0.x/HTML/Content/Authoring/ConnectingToVertica/vsql/Variables/ON_ERROR_STOP.htm

検証バージョンについて

この記事の内容はVertica 12.0で確認しています。

更新履歴

2023/01/13 「補足」⇒「注意点」に変更、「注意点」に ON_ERROR_STOP を設定しない場合の実行例を追加、
                  「参考情報」の見出しを追加
2017/04/07 本記事を公開