2013-02-11 25 views
0

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

错误代码是00103,“遇到一个;预计当......”

那么多标点符号的列表。从研究问题中我看到了对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; 
/
+4

会发生什么事,如果你删除';'')'和'THEN'之间? – ruakh 2013-02-11 21:09:43

+1

令人惊讶的是,错误信息告诉你*完全*问题是什么... – 2013-02-12 02:39:42

回答

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; 

我说应该,因为我没有甲骨文在我的笔记本电脑,所以只能在SQL小提琴测试,但通过删除所有分号我能得到这是为了编译,但是我认为SQL-Fiddle将分号视为分批符号而不是语句符,因此我不确定是否有必要将它们全部删除。

Example on SQL Fiddle

+0

完美地工作,谢谢 – Rob1991 2013-02-12 16:33:24

+1

@GarethD - 你可以改变哪个字符被用来分解你的语句,这样分号不会再导致问题。例如:http://www.sqlfiddle.com/#!4/3bd96/1 – 2013-02-12 17:08:15

+1

@jakefeasel每天都是学校的一天!谢谢你的提示。 – GarethD 2013-02-12 21:04:45

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; 
/