Trigger

EXECUTE stmt USING 表達式

  • December 19, 2016

我正在INSTEAD OF視圖上編寫觸發器。我需要將一個字元串拆分為 4 個 40 個字元長的部分以插入單獨的列中。我想用來substr()將變數分解成這些部分,但是當我嘗試創建觸發器時,我得到了錯誤:

SQL 狀態:42703

供應商程式碼:-206

消息:

$$ SQL0206 $$未找到列或全域變數 SUBSTRING。

原因 。. . . . : SUBSTRING 未在 *N 中作為表 *N 的列找到,也未在 *N 中作為全域變數找到。如果表為 *N,則 SUBSTRING 不是任何可以引用的表或視圖的列。

恢復 。. . : 執行以下操作之一併再次嘗試請求:

– 確保在語句中正確指定了列名和表名。

– 如果這是一條 SELECT 語句,請確保在 FROM 子句中命名了所有必需的表。

– 如果該列旨在作為相關參考,請使用正確的表指示符來限定該列。

– 如果該列旨在成為全域變數,請使用全域變數所在的架構限定名稱或確保架構在路徑中。

這個頁面表明我可以在我的USING子句中使用表達式,只要它在復合 SQL 語句中。據我了解,觸發器之間BEGINEND触發器中的 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, ...

引用自:https://dba.stackexchange.com/questions/158395