通过SQL*PLUS的Oracle Pl/SQL触发器编译错误

通过SQL*PLUS的Oracle Pl/SQL触发器编译错误,oracle,view,triggers,Oracle,View,Triggers,我在通过SQL*PLUS编译Oracle触发器时遇到了一个问题-我不认为我是愚蠢的,但我看不出问题出在哪里 我们有一个安装程序脚本,它本质上是一个批处理文件,通过在多个脚本上调用SQLPLUS来创建/刷新数据库中的所有对象,每个脚本都包含一个视图、触发器等。首先创建表和视图,然后再创建触发器。下面的V_BS_GRIDFIELDS视图此时可能创建,也可能不创建,也可能稍后通过不同的过程创建。该视图是一个可更新的视图,因此我们在其上放置了一个触发器,用于将更新推送到不同的表,如下所示: CREATE

我在通过SQL*PLUS编译Oracle触发器时遇到了一个问题-我不认为我是愚蠢的,但我看不出问题出在哪里

我们有一个安装程序脚本,它本质上是一个批处理文件,通过在多个脚本上调用SQLPLUS来创建/刷新数据库中的所有对象,每个脚本都包含一个视图、触发器等。首先创建表和视图,然后再创建触发器。下面的
V_BS_GRIDFIELDS
视图此时可能创建,也可能不创建,也可能稍后通过不同的过程创建。该视图是一个可更新的视图,因此我们在其上放置了一个触发器,用于将更新推送到不同的表,如下所示:

CREATE OR REPLACE FORCE TRIGGER TR_INSTUPD_BS
  INSTEAD OF INSERT OR UPDATE OR DELETE 
  ON V_BS_GRIDFIELDS
FOR EACH ROW
BEGIN

  IF INSERTING OR DELETING THEN
    NULL;
  END IF;

  IF UPDATING THEN
    -- Can only change these fields
    IF (:OLD.VISIBLE <> :NEW.VISIBLE) OR (:OLD.COMPULSORY <> :NEW.COMPULSORY) THEN 

      -- Source Table = BS_GRIDFIELDS
      IF (:OLD.SOURCE_TYPE = 0) THEN

        UPDATE BS_GRIDFIELDS BS_GF
           SET BS_GF.VISIBLE    = :NEW.VISIBLE,
               BS_GF.COMPULSORY = :NEW.COMPULSORY
         WHERE BS_GF.FIELD_NAME = :OLD.FIELD_NAME;

      END IF;
    END IF;
  END IF;
END;

如果删除第6行上的空行,则似乎在第一分号上停止编译,第7行:

SQL> @"TR_INSTUPD_BS.sql";

Warning: Trigger created with compilation errors.

SP2-0042: unknown command "END IF" - rest of line ignored.
SP2-0734: unknown command beginning "IF UPDATIN..." - rest of line ignored.
SP2-0734: unknown command beginning "IF (:OLD.V..." - rest of line ignored.
SP2-0734: unknown command beginning "IF (:OLD.S..." - rest of line ignored.
SP2-0552: Bind variable "OLD" not declared.
SP2-0042: unknown command "END IF" - rest of line ignored.
SP2-0042: unknown command "END IF" - rest of line ignored.
SP2-0042: unknown command "END IF" - rest of line ignored.
SP2-0042: unknown command "END" - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SQL>
我们用这种方式创建了很多触发器,它们都有空格、分号等,并且都被创建好了。我在Oracle 9、10、11上测试并看到了相同的问题。有人能解释一下吗


谢谢。

在默认设置中,SQL*Plus无法正确处理空行,您需要发出以下命令:

SQL> SET SQLBLANKLINES on


<强>更新:< /强>我回答得太快,空白行似乎不成问题。我在我的数据库中尝试了你的代码,问题似乎来自

FORCE
关键字。网站没有提到这个关键词。触发器会在您删除它时编译。

谢谢您的帮助,但我们在我在这里发帖后不久就尝试过了,没有什么不同。正如我前面提到的,有多个触发器以与此相同的方式创建,每个触发器都有空行和分号,上面的触发器是唯一以这种方式受影响的触发器。我们还尝试了
设置SQLT';'
查看分号是否存在问题,但同样没有效果:(@Kieran:我更新了答案:这里的问题似乎是FORCE关键字。有趣!我没有考虑到这一点,但我同意这似乎是个问题。奇怪的是,在使用PL/SQL developer时,这个触发器编译时有或没有FORCE关键字-这就是为什么我没有想到它。谢谢:)PL/SQL开发人员必须为您修复该语句,或者以静默方式失败。视图和类型中使用了Create或Replace Force。这不是触发器的有效构造。
SQL> SET SQLBLANKLINES on