2011-06-20 4 views
0

私は、日付の正当性をチェックするトリガを開発しました。無効な日付を格納できないのでうまく動作しますが、私も奇妙なエラーメッセージが表示され、理由を把握できません。私のコードは次のとおりです:RAISE_APPLICATION_ERROR問題

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の横にある行からエラーが発生していることに気付きました。エラーを発行するのは何ですか?

+1

エラーメッセージについて「奇妙な」と思われるのは何ですか?それは私にとって全く適切だと思われます。 –

+0

こんにちは@ p.cambellご意見ありがとうございます。私が奇妙なのは、トリガが動作するように動作することです。シンタックスに何も問題がないと思っています。私はそれを完全にチェックしました。私はこの点をどこから見るべきか分からない。 – haunted85

+2

日付検証のような一般的な機能のために私たち自身のロジックを発明する際の問題は、ルールが間違っていることです。 100で割り切れる年は、400で割り切れる場合を除いて、うるう年ではありません。すなわち、29-FEB-1900は共通年、29-FEB-2000はうるう年です。あなたの論理に29-FEB-1900が許されています。 – APC

答えて

3

「wierdエラーメッセージ」とは何ですか?それは私にとって完全に合理的なスタックトレースのように見えます。スタックの一番下に、トリガを実行中にエラーが発生しました。次の行は、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

こんにちは@JustinCaveあなたの答えに感謝します。私が奇妙なのは、トリガーが行うべきことをやっていることです。私は実際に何が問題になるかを理解していません。何度も何度も構文をチェックしています。私はかなり無知だ。 – haunted85

+1

@ haunted85 - トリガーは、おそらく、あなたが日、月、年の無効な組み合わせを挿入しようとしているため、エラーを発生させます。トリガーは、DML操作が失敗する原因となるエラーを発生させて、無効なデータの挿入を防ぎます。それが期待される行動です。また、トリガー内のデータを検証することは非常にまれです。 –

0

これは、あなたが無効な日を挿入していることをあなた自身のルールで示していることを意味します。

日が31より大きい場合、トリガーはora-20101を上げています。それだけです。