PL/SQL编写触发器跨库更新表报ORA-00936缺失表达式错误如何解决
报错原因分析
- 核心语法错误:你提供的触发器UPDATE语句SET子句中,
CREATION_DATE = = :new.CREATED_DTTM多写了一个等于号,Oracle SQL的赋值语法仅支持单个=,连续的双等号属于非法表达,这是触发ORA-00936 缺失表达式的根本原因。 - 报错行偏移说明:Oracle PL/SQL编译报错的行号存在偏移特性,当嵌套在IF块内的SQL语句存在语法错误时,编译器会先抛出
PL/SQL: SQL Statement ignored提示上层块语句被忽略,再将错误位置关联到上层IF判断块的临近行,所以你看到的报错行和实际错误行不匹配属于正常的编译提示偏差。
修正后的触发器代码
CREATE OR REPLACE TRIGGER TRG_UPDATE_ITIN AFTER DELETE OR UPDATE ON FDL.PLA_ET REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN IF DELETING THEN UPDATE FMS.ITIN SET PLN_ET_UUID = NULL WHERE PLN_ET_UUID = :OLD.PLN_ET_UUID; ELSIF UPDATING THEN IF :new.START_DT != :old.START_DT OR :new.END_DT != :old.END_DT OR :new.CREATED_DTTM != :old.CREATED_DTTM OR :new.CREATED_USER_ID != :old.CREATED_USER_ID OR :new.ACT_UUID != :old.ACT_UUID OR :new.FO_CD != :old.FO_CD THEN UPDATE FMS.ITIN SET START_DATE = :new.START_DT, END_DATE = :new.END_DT, CREATION_DATE = :new.CREATED_DTTM, -- 仅保留单个等于号 CREATED_BY_USER = :new.CREATED_USER_ID, ACT_UUID = :new.ACT_UUID, FO_CTL_NBR = :new.FO_CD WHERE PLN_ET_UUID = :new.PLN_ET_UUID; END IF; END IF; END; /
补充说明:如果后续运行中出现字段值为空时比较逻辑不生效的问题,可以将
!=替换为<>, 或者使用NVL函数处理空值比较,例如NVL(:new.START_DT, DATE'1900-01-01') <> NVL(:old.START_DT, DATE'1900-01-01')。
内容的提问来源于stack exchange,提问作者diasdreamer
相关产品推荐
相关产品推荐

