SQL Trigger WHEN子句编译错误

时间:2013-02-11 21:04:36

标签: sql oracle plsql triggers

我正在尝试创建一个触发器,如果​​输入的Prog_Type'FILM',则会检查输入的日期是否在范围内,但是每次运行该语句时都会收到编译错误。

  

错误代码为00103,“遇到a;当预期.....”

然后是许多标点符号的列表。从研究问题我看到了对DECLARE语句的引用,但是我不确定是否需要声明Prog_Type是否在Program_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;
/

2 个答案:

答案 0 :(得分:4)

您的语法几乎没问题,但是在导致错误的;条件之后您有IF;用于分隔语句和结果.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将分号视为批处理中断而不是语句中断,因此我不确定是否有必要将它们全部删除。

<强> Example on SQL Fiddle

答案 1 :(得分:0)

嘿,你在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;
/