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
修正方案
- 触发器中引用当前行字段必须加
:new/:old前缀(账号字段通常不会变更,用:new.NUMEROCOMPTE即可) DATESOLDE字段需要赋值,这里用SYSDATE获取当前操作时间,符合业务逻辑- 建议在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
相关产品推荐
相关产品推荐

