我正在尝试创建一个触发器,如果输入的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;
/
答案 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;
/