ビューに_INSTEAD OF
_トリガーを書き込んでいます。文字列を4つの40文字の長さの部分に分割して、別々の列に挿入する必要があります。 substr()
を使用して変数をこれらの部分に分割したいのですが、トリガーを作成しようとするとエラーが発生します。
SQL状態:42703
ベンダーコード:-206
メッセージ:[SQL0206]列またはグローバル変数SUBSTRINGが見つかりません。
原因。 。 。 。 。 :SUBSTRINGは、* Nのテーブル* Nの列として検出されず、* Nのグローバル変数として検出されませんでした。テーブルが* Nの場合、SUBSTRINGは、参照できるテーブルまたはビューの列ではありません。
回復。 。 。 :次のいずれかを実行して、リクエストを再試行してください。
-列名とテーブル名がステートメントで正しく指定されていることを確認してください。
-これがSELECTステートメントの場合は、必要なすべてのテーブルがFROM句で指定されていることを確認してください。
-列が相関参照であることが意図されていた場合は、正しいテーブル指定子で列を修飾します。
-列がグローバル変数であることが意図されていた場合は、グローバル変数が存在するスキーマで名前を修飾するか、スキーマがパスにあることを確認してください。
このページ は、複合SQLステートメント内にある限り、USING
句で式を使用できることを示します。私が理解しているように、トリガー内のBEGIN
とEND
の間のSQLは、複合SQLステートメントと見なされます。
「ホスト変数以外の式は、EXECUTEステートメントが複合SQL(コンパイル済み)ステートメント内で使用されている場合にのみ使用できます。」
_CREATE OR REPLACE TRIGGER MYLIB.INFO_INSERT
INSTEAD OF INSERT ON MYLIB.INFO
REFERENCING NEW AS N
FOR EACH ROW
MODE DB2SQL
BEGIN
DECLARE...
...
set insert_into_info = 'INSERT INTO MYLIB.' || info || ' (
CICUST, CIINF1, CIINF2, CIINF3, CIINF4
) VALUES (' || NEW_ID || ', ?, ?, ?, ? )';
PREPARE s1 from insert_into_info;
EXECUTE s1 using substring(paddedComments, 1, 40), substring(paddedComments, 41, 80),
substring(paddedComments, 81, 120), substring(paddedComments, 121, 160);
END;
_
USING
句で関数を使用するOracleの例を見つけましたが、iSeriesまたはDB2の例はありません。ただし、EXECUTE
ステートメントの説明には、期待し続けるのに十分なヒントがあります。該当する場合は、z/OS7.2を実行しています。
私は探し回っていますが、これを理解することができませんでした。誰かが私を正しい方向に向かわせることができますか?最後に文字列を分割する必要がないように、配列を使用してこれを実行しようとしましたが、このトリガー内で配列型を宣言して使用することもできませんでした。
_EXECUTE ... USING
_には式ではなくホスト変数名が必要ですが、SUBSTRING(whatever)
は式です。 4つのホスト変数を宣言し、それらにSUBSTRING(...)
式の結果を割り当ててから、それらの変数をEXECUTE
ステートメントで使用する必要があります。
または、式を動的ステートメント自体に移動することもできます。
_set insert_into_info = 'INSERT INTO MYLIB.' || info || ' (
CICUST, CIINF1, CIINF2, CIINF3, CIINF4, CISAD1, CISAD2,
CISCTY, CISSTA, CISZIP, CISCRY
) VALUES (' || NEW_ID || ', substring(?, 1, 40), ' ||
'substring(?, 41, 80)' || ...
...
EXECUTE s1 using paddedComments, paddedComments, ...
_