【问题标题】:SQL Trigger WHEN Clause compilation errorSQL 触发 WHEN 子句编译错误
【发布时间】:2017-03-20 05:25:12
【问题描述】:

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

【问题讨论】:

  • 如果删除)THEN 之间的; 会发生什么?
  • 令人惊讶的是,错误消息告诉您正是问题是什么......

标签: sql oracle plsql triggers


【解决方案1】:

您的语法几乎没问题,但是在导致错误的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

【讨论】:

  • @GarethD - 您可以更改用于拆分语句的字符,这样分号将不再引起问题。例如:sqlfiddle.com/#!4/3bd96/1
  • @jakefeasel 每天都是上学日!感谢您的提示。
【解决方案2】:

您好,您在 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;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2014-05-27
    • 1970-01-01
    • 2010-12-12
    • 2014-11-29
    相关资源
    最近更新 更多