我开发了一个检查日期有效性的触发器。它工作正常,因为它阻止我存储无效的日期,但我也得到一个奇怪的错误信息,我无法弄清楚为什么。我的代码如下:
CREATE OR REPLACE TRIGGER "CHECKDATEVALIDITY"
BEFORE INSERT OR UPDATE
ON Event
FOR EACH ROW
BEGIN
IF :NEW.day < 1 OR :NEW.month < 1 OR :NEW.month > 12
THEN
RAISE_APPLICATION_ERROR(-20101, 'Wrong date');
END IF;
IF :NEW.month = 4 OR :NEW.month = 6 OR :NEW.month = 9 OR :NEW.month = 11
THEN
IF :NEW.day > 30
THEN
RAISE_APPLICATION_ERROR(-20101, 'Wrong date');
END IF;
ELSIF :NEW.month = 2
THEN
IF (mod(:NEW.year, 4) = 0)
THEN
IF :NEW.day > 29
THEN
RAISE_APPLICATION_ERROR(-20101, 'Wrong date');
END IF;
ELSIF :NEW.day > 28
THEN
RAISE_APPLICATION_ERROR(-20101, 'Wrong date');
END IF;
ELSE
IF :NEW.day > 31
THEN
RAISE_APPLICATION_ERROR(-20101, 'Wrong date');
END IF;
END IF;
END checkDateValidity;
我得到的错误是:
错误ORA-20101:错误的日期ORA-06512:在“USER587.CHECKDATEVALIDITY”,第28行ORA-04088:执行触发器'USER578.CHECKDATEVALIDITY'时出错。
此外,我注意到我从调用的RAISE_APPLICATION_ERROR旁边的行中收到错误。什么会发出错误?
答案 0 :(得分:3)
您认为“奇怪的错误消息”是什么?它看起来像是一个完全合理的堆栈跟踪给我。在堆栈的底部,执行触发器时出错。下一行告诉您错误发生在第28行。堆栈的顶部是您的自定义错误消息和编号。这对我来说似乎很正常(尽管你似乎已经切断了与ORA-06512错误相关的一些错误文本)
ORA-20101: Wrong date
ORA-06512: on "USER587.CHECKDATEVALIDITY", line 28
ORA-04088: error while executing trigger 'USER578.CHECKDATEVALIDITY'.
如果您要尝试匹配行号,请查看DBA_SOURCE
。例如,这将显示触发器的第23-32行(违规行+/- 5行)的内容。
SELECT line, text
FROM dba_source
WHERE owner = 'USER578'
AND name = 'CHECKDATEVALIDITY'
AND line BETWEEN 23 and 32;
当然,我认为这是一个课堂练习,而不是你在现实世界中所做的事情。在现实世界中,您将存储在DATE列中,让Oracle负责确保输入有效日期。
答案 1 :(得分:0)
这意味着您(按照您自己的规则)插入无效日期。
如果当天大于31,你的触发器会提升ora-20101,而且就是这样。