EXECUTE stmt USING 表達式
我正在
INSTEAD OF
視圖上編寫觸發器。我需要將一個字元串拆分為 4 個 40 個字元長的部分以插入單獨的列中。我想用來substr()
將變數分解成這些部分,但是當我嘗試創建觸發器時,我得到了錯誤:SQL 狀態:42703
供應商程式碼:-206
消息:
$$ SQL0206 $$未找到列或全域變數 SUBSTRING。
原因 。. . . . : SUBSTRING 未在 *N 中作為表 *N 的列找到,也未在 *N 中作為全域變數找到。如果表為 *N,則 SUBSTRING 不是任何可以引用的表或視圖的列。
恢復 。. . : 執行以下操作之一併再次嘗試請求:
– 確保在語句中正確指定了列名和表名。
– 如果這是一條 SELECT 語句,請確保在 FROM 子句中命名了所有必需的表。
– 如果該列旨在作為相關參考,請使用正確的表指示符來限定該列。
– 如果該列旨在成為全域變數,請使用全域變數所在的架構限定名稱或確保架構在路徑中。
這個頁面表明我可以在我的
USING
子句中使用表達式,只要它在復合 SQL 語句中。據我了解,觸發器之間BEGIN
和END
触發器中的 SQL 將被視為複合 SQL 語句。“只有在復合 SQL(編譯)語句中使用 EXECUTE 語句時,才能使用除主機變數之外的表達式。”
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;
我找到了 Oracle 在
USING
子句中使用函式的範例,但沒有 iSeries 或 DB2 範例,儘管語句描述中有足夠的提示EXECUTE
讓我保持希望。如果相關,我正在執行 z/OS 7.2。我一直在四處尋找,但還沒有弄清楚;誰能讓我朝著正確的方向前進?我也嘗試使用數組來執行此操作,因此我不必在最後分解字元串,但我也無法在此觸發器中聲明和使用數組類型。
EXECUTE ... USING
需要宿主變數名,而不是表達式,whileSUBSTRING(whatever)
是一個表達式。您將需要聲明四個主變數,將表達式的結果分配給它們,然後在語句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, ...