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

PL/SQL触发ORA-00984错误求助:列不允许使用问题排查

PL/SQL触发器ORA-00984错误解决

你的触发器代码执行时出现的ORA-00984: Column Not Allowed错误,核心原因是INSERT语句里的NUMEROCOMPTE和DATESOLDE未明确指定来源,PL/SQL无法识别这些标识符。

原代码

CREATE TRIGGER operation
AFTER UPDATE ON COMPTE
for each row
BEGIN
IF :old.solde > :new.solde THEN 
INSERT INTO HISTORY VALUES(NUMEROCOMPTE,DATESOLDE,'Retrait');
end if;
IF :old.solde < :new.solde THEN 
INSERT INTO HISTORY VALUES(NUMEROCOMPTE,DATESOLDE,'Versement');
end if;
end;
/

错误信息

3/1       PL/SQL: SQL Statement ignored
3/41      PL/SQL: ORA-00984: Column Not Allowed
6/1       PL/SQL: SQL Statement ignored
6/41      PL/SQL: ORA-00984: Column Not Allowed
Errors  : check compiler log

修正方案

  1. 触发器中引用当前行字段必须加:new/:old前缀(账号字段通常不会变更,用:new.NUMEROCOMPTE即可)
  2. DATESOLDE字段需要赋值,这里用SYSDATE获取当前操作时间,符合业务逻辑
  3. 建议在INSERT语句中显式指定目标表的字段列表,避免后续表结构变更引发插入失败

修正后的代码

CREATE TRIGGER operation
AFTER UPDATE ON COMPTE
FOR EACH ROW
BEGIN
    IF :old.solde > :new.solde THEN 
        INSERT INTO HISTORY (NUMEROCOMPTE, DATESOLDE, OPERATION_TYPE)
        VALUES(:new.NUMEROCOMPTE, SYSDATE, 'Retrait');
    END IF;
    IF :old.solde < :new.solde THEN 
        INSERT INTO HISTORY (NUMEROCOMPTE, DATESOLDE, OPERATION_TYPE)
        VALUES(:new.NUMEROCOMPTE, SYSDATE, 'Versement');
    END IF;
END;
/

注:代码中OPERATION_TYPE是假设的HISTORY表存储操作类型的字段名,若你的表中实际字段名不同,需替换为对应名称。

内容的提问来源于stack exchange,提问作者jaouadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:01:10