2014-08-29 16 views
0

嗨我目前正在制定一個SQL觸發器應該說「當插入一行到CUSTOMER_ALIAS表,檢查是否任何該行中的三個地址列含有存在於US_STATES表中的值(其由一列的 - 「COUNTRY_NAME」),如果客戶的地址是美國狀態然後設置INDICIA_STATE當前插入「真」的那一行的列表使用不同的表觸發器檢查條件,然後更改取決於結果插入的行的值

CREATE TRIGGER ADDRESS_T BEFORE INSERT ON MYDB.CUSTOMER_ALIAS 
    REFERENCING NEW ROW AS NEW_ROW 
     WHEN 
      EXISTS(SELECT * FROM MYDB.US_STATES WHERE US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_1_COUNTRY OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_2_COUNTRY OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_3_COUNTRY) 
     THEN SET NEW_ROW.INDICIA_STATE= 'true' 
; 

我得到這個錯誤

Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=CREATE TRIGGER ADDRESS_T BEFORE INSERT ON D;BEGIN-OF-STATEMENT;<space>, DRIVER=4.16.53 
SQLState: 42601 
ErrorCode: -104 

根據IBM's error code list這似乎是一個語法錯誤,但我不明白的地方它的來源。這個觸發器應該如何看待?

+0

刪除了mysql標籤,因爲問題與DB2有關。 – 2014-08-29 02:21:11

回答

0

我不認爲then是觸發器語法的一部分。您還可以使用in簡化邏輯。所以這可能工作:

CREATE TRIGGER ADDRESS_T BEFORE INSERT ON MYDB.CUSTOMER_ALIAS 
    REFERENCING NEW ROW AS NEW_ROW 
    FOR EACH ROW 
    WHEN EXISTS(SELECT 1 FROM MYDB.US_STATES WHERE US_STATES.COUNTRY_NAME IN (NEW_ROW.ADDRESS_1_COUNTRY, NEW_ROW.ADDRESS_2_COUNTRY, NEW_ROW.ADDRESS_3_COUNTRY) 
       ) 
     SET NEW_ROW.INDICIA_STATE = 'true'; 
+0

沒有工作,它給了我同樣的錯誤 - 任何人都可以確認,如果上述是有效的語法,也許我的問題是由別的東西引起的。 – 2014-08-29 02:54:35

+0

@borisdzhelali看起來像你錯過了'FOR EACH ROW MODE DB2SQL'或'FOR EACH STATEMENT MODE DB2SQL' clause; [更多信息](http://www-01.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/com.ibm.db2z11.doc.sqlref/src/tpc/db2z_sql_createtrigger.dita) – Rimas 2014-08-30 14:59:40

0

除了什麼戈登說,你應該說明它是否是一個行或語句觸發器,我也覺得WHEN子句需要它自己的括號:

CREATE TRIGGER ADDRESS_T 
BEFORE INSERT ON MYDB.CUSTOMER_ALIAS 
REFERENCING NEW ROW AS NEW_ROW 
FOR EACH ROW 
WHEN (
    EXISTS (
    SELECT * FROM MYDB.US_STATES 
    WHERE US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_1_COUNTRY 
     OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_2_COUNTRY 
     OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_3_COUNTRY 
) 
) 
    SET NEW_ROW.INDICIA_STATE= 'true' 

;

相關問題