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 に答える