Oracle触发器异常触发求助:空FECHASALIDA时始终触发报错
解决Oracle触发器空值触发报错的问题
嘿,我来帮你搞定这个触发器的问题!
问题原因
你现在的触发器条件是直接比较FECHAINGRESO > FECHASALIDA,但在Oracle的SQL三值逻辑里,任何和NULL(空值)做比较的结果都是NULL,而PL/SQL的IF语句会把NULL当作FALSE处理——那为什么你会看到报错?其实是原来的错误信息拼接导致的:当FECHASALIDA为空时,:NEW.FECHASALIDA||'No se puede...'会生成NULLNo se puede...这样的奇怪字符串,让你误以为是触发器触发了校验逻辑,但实际上真正的问题是你的触发器没有先判断FECHASALIDA是否有值,直接进行了无意义的比较。
另外,你的需求是仅当FECHASALIDA早于FECHAINGRESO时才报错,所以必须先排除空值的情况,避免不必要的校验触发。
解决办法
修改触发器的条件,先判断FECHASALIDA不为空,再检查日期顺序,同时替换成你想要的错误提示:
CREATE OR REPLACE TRIGGER FECHASALIDA BEFORE INSERT ON EXPEDIENTES FOR EACH ROW BEGIN -- 仅当离开日期已填写,且早于录入日期时触发报错 IF (:NEW.FECHASALIDA IS NOT NULL AND :NEW.FECHASALIDA < :NEW.FECHAINGRESO) THEN RAISE_APPLICATION_ERROR(-20600, 'Hi, you just cant do that bro'); END IF; END; /
额外提示
如果需要在更新案件日期时也触发这个校验,可以把触发器的触发时机改为BEFORE INSERT OR UPDATE,这样修改已有案件的离开日期时也会检查合理性。
内容的提问来源于stack exchange,提问作者Joaquín García Macías
相关产品推荐
相关产品推荐

