2017-05-16 29 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