2017-05-16 64 views
0

在Oracle 12c上,我需要使用過濾器創建觸發器。我的過濾器是:使用過濾器觸發器

WHEN PERIOD <> FN_PERIODNEXT 

其中FN_PERIODNEXT是一個函數。

以下是觸發器的代碼。

CREATE OR REPLACE TRIGGER AFTERIUDLIQUIDATIONSDETAILS 
    BEFORE INSERT OR DELETE 
    ON LIQUIDATIONSDETAILS 
    FOR EACH ROW 
    WHEN (NEW.PERIODID <> FN_PERIODNEXT) 
BEGIN 
    IF INSERTING 
    THEN 
     UPDATE APPOINTSOFCAS 
     SET INLD = INLD + 1 
     WHERE  CUSTOMERID = :NEW.CUSTOMERID 
      AND ID = :NEW.APPOINTOFCAID 
      AND KINDCONTROLID = :NEW.KINDCONTROLID; 
    END IF; 

    IF DELETING 
    THEN 
     UPDATE APPOINTSOFCAS 
     SET INLD = INLD - 1 
     WHERE  CUSTOMERID = :OLD.CUSTOMERID 
      AND ID = :OLD.APPOINTOFCAID 
      AND KINDCONTROLID = :OLD.KINDCONTROLID; 
    END IF; 
END; 
/

這編譯失敗,具有:

[Error] Compilation (8: 26): ORA-04076: invalid NEW or OLD specification 
+0

什麼是錯誤訊息? – Tenzin

+0

[錯誤]編譯(8:26):ORA-04076:無效的NEW或OLD規範 – Giorgos

回答

3

WHEN子句是Boolean表達式由Oracle執行該觸發器的身體前評估。你需要改變這一行,因爲它的語法問題,因此不編譯。

WHEN (NEW.PERIOD <> OLD.FN_PERIODNEXT) 

現在考慮的事實,你FN_PERIODNEXT是Function,那麼上面的語句將not work。上述statememt評估僅適用於表格列。

在你的情況,你需要你的觸發作爲體內處理這種情況:

If FN_PERIODNEXT <> :NEW.PERIOD then 
. . 
.. 
.. 
End if; 

所以,你的觸發變得像:

CREATE OR REPLACE TRIGGER AFTERIUDLIQUIDATIONSDETAILS 
    BEFORE INSERT OR DELETE 
    ON LIQUIDATIONSDETAILS 
    FOR EACH ROW 
    --WHEN (NEW.PERIODID <> FN_PERIODNEXT) 
BEGIN 
If FN_PERIODNEXT <> :NEW.PERIOD 
    then 

    IF INSERTING 
    THEN 
     UPDATE APPOINTSOFCAS 
     SET INLD = INLD + 1 
     WHERE  CUSTOMERID = :NEW.CUSTOMERID 
      AND ID = :NEW.APPOINTOFCAID 
      AND KINDCONTROLID = :NEW.KINDCONTROLID; 
    END IF; 

    IF DELETING 
    THEN 
     UPDATE APPOINTSOFCAS 
     SET INLD = INLD - 1 
     WHERE  CUSTOMERID = :OLD.CUSTOMERID 
      AND ID = :OLD.APPOINTOFCAID 
      AND KINDCONTROLID = :OLD.KINDCONTROLID; 
    END IF; 
END IF; 
END; 
/
+0

現在我收到此錯誤:[錯誤] PLS-00201(9:27):PLS-00201:標識符'NEW.PERIODID'必須被宣佈爲 – Giorgos

+0

檢出列名稱。我想你在觸發器定義中將'PERIOD'錯誤地發佈爲'PERIODID',並且我複製了它。 – XING

+0

@XING你錯過了:在NEW.PERIOD前面 – Boneist