web-dev-qa-db-ja.com

式を使用してstmtを実行します

ビューに_INSTEAD OF_トリガーを書き込んでいます。文字列を4つの40文字の長さの部分に分割して、別々の列に挿入する必要があります。 substr()を使用して変数をこれらの部分に分割したいのですが、トリガーを作成しようとするとエラーが発生します。

SQL状態:42703
ベンダーコード:-206
メッセージ:[SQL0206]列またはグローバル変数SUBSTRINGが見つかりません。
原因。 。 。 。 。 :SUBSTRINGは、* Nのテーブル* Nの列として検出されず、* Nのグローバル変数として検出されませんでした。テーブルが* Nの場合、SUBSTRINGは、参照できるテーブルまたはビューの列ではありません。
回復。 。 。 :次のいずれかを実行して、リクエストを再試行してください。
-列名とテーブル名がステートメントで正しく指定されていることを確認してください。
-これがSELECTステートメントの場合は、必要なすべてのテーブルがFROM句で指定されていることを確認してください。
-列が相関参照であることが意図されていた場合は、正しいテーブル指定子で列を修飾します。
-列がグローバル変数であることが意図されていた場合は、グローバル変数が存在するスキーマで名前を修飾するか、スキーマがパスにあることを確認してください。

このページ は、複合SQLステートメント内にある限り、USING句で式を使用できることを示します。私が理解しているように、トリガー内のBEGINENDの間の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を実行しています。

私は探し回っていますが、これを理解することができませんでした。誰かが私を正しい方向に向かわせることができますか?最後に文字列を分割する必要がないように、配列を使用してこれを実行しようとしましたが、このトリガー内で配列型を宣言して使用することもできませんでした。

1
Sarah Kemp

_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, ...
_
3
mustaccio