Oracle 带滤波器的触发器

Oracle 带滤波器的触发器,oracle,plsql,Oracle,Plsql,在Oracle 12c上,我需要创建一个带有筛选器的触发器。我的过滤器是: WHEN PERIOD <> FN_PERIODNEXT 无法编译,原因是: [Error] Compilation (8: 26): ORA-04076: invalid NEW or OLD specification WHEN子句是一个Boolean表达式,在执行触发器主体之前由Oracle计算。您需要更改此行,因为这是一个语法问题,因此不需要编译 WHEN (NEW.PERIOD <>

在Oracle 12c上,我需要创建一个带有筛选器的触发器。我的过滤器是:

WHEN PERIOD <> FN_PERIODNEXT
无法编译,原因是:

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

WHEN
子句是一个
Boolean
表达式,在执行触发器主体之前由Oracle计算。您需要更改此行,因为这是一个语法问题,因此不需要编译

WHEN (NEW.PERIOD <> OLD.FN_PERIODNEXT)
所以你的触发器会变成:

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;
/
在IUDLiquidationDetails之后创建或替换触发器
在插入或删除之前
关于清算细节
每行
--时间(NEW.PERIODID FN\u periodinext)
开始
如果FN_PERIOD下一个:NEW.PERIOD
然后
如果插入
然后
更新任命
设置INLD=INLD+1
其中CUSTOMERID=:NEW.CUSTOMERID
和ID=:NEW.APPOINTOFCAID
和KINDCONTROLID=:NEW.KINDCONTROLID;
如果结束;
如果删除
然后
更新任命
设置INLD=INLD-1
其中CUSTOMERID=:OLD.CUSTOMERID
和ID=:OLD.APPOINTOFCAID
和KINDCONTROLID=:OLD.KINDCONTROLID;
如果结束;
如果结束;
结束;
/

WHEN子句是一个
布尔表达式,在执行触发器主体之前由Oracle计算。您需要更改此行,因为这是一个语法问题,因此不需要编译

WHEN (NEW.PERIOD <> OLD.FN_PERIODNEXT)
所以你的触发器会变成:

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;
/
在IUDLiquidationDetails之后创建或替换触发器
在插入或删除之前
关于清算细节
每行
--时间(NEW.PERIODID FN\u periodinext)
开始
如果FN_PERIOD下一个:NEW.PERIOD
然后
如果插入
然后
更新任命
设置INLD=INLD+1
其中CUSTOMERID=:NEW.CUSTOMERID
和ID=:NEW.APPOINTOFCAID
和KINDCONTROLID=:NEW.KINDCONTROLID;
如果结束;
如果删除
然后
更新任命
设置INLD=INLD-1
其中CUSTOMERID=:OLD.CUSTOMERID
和ID=:OLD.APPOINTOFCAID
和KINDCONTROLID=:OLD.KINDCONTROLID;
如果结束;
如果结束;
结束;
/

错误消息是什么?[错误]编译(8:26):ORA-04076:无效的新规范或旧规范错误消息是什么?[错误]编译(8:26):ORA-04076:无效的新规范或旧规范现在我接受此错误:[错误]PLS-00201(9:27):PLS-00201:必须声明标识符'NEW.PERIODID'。请检查列名。我猜你在触发器定义中将
PERIOD
错误地发布为
PERIODID
,我复制了它。@XING你缺少了NEW.PERIODID前面的:谢谢Boneist,这是第二个缺少的部分,现在我接受这个错误:[错误]PLS-00201(9:27):PLS-00201:必须声明标识符“NEW.PERIODID”请检查列名。我猜你在触发器定义中将
PERIOD
错误地发布为
PERIODID
,我复制了它。@XING你缺少了新的.PERIOD前面的:谢谢Boneist,这是第二个缺少的部分,