You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:27:02