RAISE_APPLICATION_ERROR проблема - PullRequest
0 голосов
/ 20 июня 2011

Я разработал триггер, который проверяет правильность даты.Это работает нормально, потому что мешает мне сохранить неверную дату, но я также получаю странное сообщение об ошибке и не могу понять, почему.Мой код следующий:

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», строка 28ORA-04088: ошибка при выполнении триггера 'USER578.CHECKDATEVALIDITY'.

Также я заметил, что я получаю сообщение об ошибке в строке рядом с вызванной RAISE_APPLICATION_ERROR.Что выдает ошибку?

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Что вы считаете «странным сообщением об ошибке»? Это выглядит как вполне разумный след стека для меня. В нижней части стека вы получили ошибку при выполнении триггера. Следующая строка сообщает вам, что ошибка произошла в строке 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 позаботиться о том, чтобы была введена правильная дата.

0 голосов
/ 20 июня 2011

Это означает, что вы (по вашим собственным правилам) вставляете неверный день.

Ваш триггер поднимает ora-20101, если день больше 31, и это именно так.

...