0

我开发了一个触发器来检查日期的有效性。它工作正常,因为它可以防止我存储无效日期,但我也收到一条奇怪的错误消息,我不知道为什么。我的代码如下:

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 旁边的行中得到错误。什么发出错误?

4

2 回答 2

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 负责确保输入的日期有效。

于 2011-06-20T18:07:35.457 回答
0

这意味着您(根据您自己的规则)插入了无效的日期。

如果日期大于 31,您的触发器将提高 ora-20101,它就是这样做的。

于 2011-06-20T18:09:30.900 回答