0

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

错误代码是 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

2 回答 2

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 将分号视为批处理中断而不是语句中断,所以我不确定是否有必要将它们全部删除。

SQL Fiddle 示例

于 2013-02-11T21:30:11.813 回答
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;
/
于 2013-02-12T03:52:58.857 回答