触发器触发时出现ORA-01858错误,DATE字段类型为何报错?
解决ORA-01858错误的思路
虽然两张表的目标字段都是DATE类型,但这个错误大概率是你在触发器代码里对DATE类型做了不必要的字符串处理,导致Oracle被迫做隐式类型转换时出错。
常见错误场景及修正:
错误写法1:多余的TO_DATE转换
比如你可能写了这种画蛇添足的代码:CREATE OR REPLACE TRIGGER TRG_NAME AFTER UPDATE OF ENTERED_DATE ON TABLE_1 FOR EACH ROW BEGIN UPDATE TABLE_2 SET ENTRY_DATE = TO_DATE(:NEW.ENTERED_DATE, 'YYYY-MM-DD') WHERE TABLE_2.关联字段 = :NEW.关联字段; END; /这里
:NEW.ENTERED_DATE本身就是DATE类型,再套TO_DATE会先把DATE转成字符串(用当前会话的日期格式),再试图转成DATE,一旦会话格式和你指定的YYYY-MM-DD不匹配,就会触发ORA-01858。错误写法2:把变量当成字符串包裹
比如错误地给:NEW.ENTERED_DATE加了单引号:SET ENTRY_DATE = ':NEW.ENTERED_DATE'这会把字符串
:NEW.ENTERED_DATE赋值给DATE字段,Oracle试图把这个完全不符合日期格式的字符串转成DATE时自然会报错。
正确的触发器写法
直接使用:NEW.ENTERED_DATE赋值即可,不需要任何额外转换:
CREATE OR REPLACE TRIGGER TRG_NAME AFTER UPDATE OF ENTERED_DATE ON TABLE_1 FOR EACH ROW BEGIN UPDATE TABLE_2 SET ENTRY_DATE = :NEW.ENTERED_DATE WHERE TABLE_2.关联字段 = :NEW.关联字段; -- 替换成你实际的关联条件 END; /
另外也可以检查下触发器里的关联条件,如果关联字段类型不匹配(比如一个是VARCHAR2一个是NUMBER),也可能引发隐式转换导致这个错误,但核心问题还是DATE字段的赋值逻辑。
内容的提问来源于stack exchange,提问作者samg
相关产品推荐
相关产品推荐

