0

入力した日付が範囲内にあるかどうかを確認するトリガーを作成しようとしていますがProg_Type'FILM'ステートメントを実行するたびにコンパイルエラーが発生します。

エラーコードは00103、「予期されたときに;が発生しました.....」です。

次に、多くの句読点のリスト。問題の調査から、ステートメントへの参照を確認しましたが、がで作成されているDECLAREかどうかを宣言する必要があるかどうかはわかりません。また、トリガーでそのテーブルを参照しています。Prog_TypeProgram_Table

CREATE OR REPLACE TRIGGER Prog_Made_Limits
BEFORE INSERT OR UPDATE OF Prog_Made ON Program_Table
 FOR EACH ROW
  WHEN (NEW.Prog_Type <> 'FILM')
BEGIN
  IF (:new.Prog_Made < date '1864-12-31' or 
      :new.Prog_Made > sysdate );
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Program Made date must be later than Dec 31st 1864, and earlier than today, if FILM is inserted');
  END IF;
END Prog_Made_Limits;
/
4

2 に答える 2

4

構文はほぼ問題ありませんが、エラーの原因となっている条件の;後にあります。ステートメントを区切るために使用され、後件部は条件と同じステートメントの一部です。IF;

これは機能するはずです:

CREATE OR REPLACE TRIGGER Prog_Made_Limits
BEFORE INSERT OR UPDATE OF Prog_Made ON Program_Table
 FOR EACH ROW
  WHEN (NEW.Prog_Type <> 'FILM')
BEGIN
  IF (:new.Prog_Made < date '1864-12-31' or 
      :new.Prog_Made > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Program Made date must be later than Dec 31st 1864, and earlier than today, if FILM is inserted');
  END IF;
END Prog_Made_Limits;

ラップトップにOracleがないので、SQL Fiddleでしかテストできないので、そうすべきだと言いますが、すべてのセミコロンを削除することで、これをコンパイルできましたが、SQL-Fiddleはセミコロンをバッチブレークとしてではなくバッチブレークとして扱うと思いますステートメントが壊れているので、それらをすべて削除する必要があるかどうかはわかりません。

SQLフィドルの例

于 2013-02-11T21:30:11.813 に答える
0

IF句の後にセミコロンを使用しました。これでステートメントは終了です。したがって、その場所から列を削除して、以下のコードを1回使用してください。

CREATE OR REPLACE TRIGGER Prog_Made_Limits
BEFORE INSERT OR UPDATE OF Prog_Made ON Program_Table
 FOR EACH ROW
  WHEN (NEW.Prog_Type <> 'FILM')
BEGIN
  IF (:new.Prog_Made < date '1864-12-31' or 
      :new.Prog_Made > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Program Made date must be later than Dec 31st 1864, and earlier than today, if FILM is inserted');
  END IF;
END Prog_Made_Limits;
/
于 2013-02-12T03:52:58.857 に答える