1
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?

More than 3 years have passed since last update.

Db2 トリガー作成をファイルに記載する場合に、ステートメント終了文字がセミコロンのままでも実行できる裏技

Last updated at Posted at 2020-03-02

Db2ではセミコロン(;)を各SQLステートメントの終了文字にして、複数のSQLステートメントをファイルに記述し、

db2 -tvf ファイル名

として実行することができます。(-tvf は -tfでもいい)
ステートメントの終了文字はセミコロンがデフォルトなのですが、CREATE TRIGGERの記載があると、セミコロンが使えない場合があります。

それはCREATE TRIGGER内にBEGIN~ENDの指定がある場合です。
というのも、BEGIN~ENDの間の各SQLステートメントの終了を示す文字もセミコロンなので、ファイルに記載する各SQLステートメントのデフォルトの終了文字のセミコロンと区別できず、そのまま実行するとエラーになってしまうのです。

そのため、通常CRAETE TRIGGER内にセミコロンを記載した場合は、以下のように各SQLステートメントの終了文字はセミコロン以外(例えば#)にします。

CREATE TABLE TAB1 (COL1 CHAR(1)) #
CREATE TABLE TAB2 (TNAME CHAR(10), COLVAL CHAR(1)) #

CREATE OR REPLACE TRIGGER TRIG_INS
AFTER INSERT ON TAB1
REFERENCING NEW AS TN
FOR EACH ROW
WHEN (TN.COL1 = 'A')
BEGIN ATOMIC
 INSERT INTO TAB2 VALUES ('TAB1','A');
END
#

そしてファイルの実行時に、-tdオプションでステートメント終了文字は#であることを指定する必要があります。

db2 -td# -vf ファイル名

でもこれって、ファイルの内容によって指定方法が異なって面倒だし、あまり使わないのでどうやって指定するんだっけ? とつい忘れちゃいますよね!

ここで便利な記載方法をご紹介します。

それは、以下のように、BEGIN~ENDの間のステートメントの終了文字のセミコロンのあとに--を追加するする方法です。( ;-- と記載するということ)

CREATE TABLE TAB1 (COL1 CHAR(1)) ;
CREATE TABLE TAB2 (TNAME CHAR(10), COLVAL CHAR(1)) ;

CREATE OR REPLACE TRIGGER TRIG_INS
AFTER INSERT ON TAB1
REFERENCING NEW AS TN
FOR EACH ROW
WHEN (TN.COL1 = 'A')
BEGIN ATOMIC
 INSERT INTO TAB2 VALUES ('TAB1','A');--
END
;

こうしておくと、他の各SQLステートメントの終了文字はセミコロンのままで、通常と同じように

db2 -tvf ファイル名

で実行できますので、覚えておくと便利です。

この方法、Db2 V9.7~現時点最新のV11.5でも利用できることは確認していますが、おそらくマニュアルには掲載されていないので、あくまでも裏技扱いでお願いします。

1
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
1
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?