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でも利用できることは確認していますが、おそらくマニュアルには掲載されていないので、あくまでも裏技扱いでお願いします。