Oracle 带滤波器的触发器
在Oracle 12c上,我需要创建一个带有筛选器的触发器。我的过滤器是: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 <>
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,这是第二个缺少的部分,