【问题标题】:Error when trying to create a new trigger - not ended properly尝试创建新触发器时出错 - 未正确结束
【发布时间】:2021-10-16 03:50:18
【问题描述】:

我正在尝试创建一个触发器,以便每当在表 1 中更新或删除行时,都会在表 2 中创建其原始数据的副本。sql 如下所示

create or replace trigger TRIG_table_2 BEFORE update or delete ON table_1 REFERENCING NEW AS NEW OLD AS OLD  for EACH ROW
BEGIN 
INSERT INTO table_2( 
    id
    ,value
    ,date_collected
    ,patient_id
) VALUES (
    :OLD.id
    , :OLD.value
    , :OLD.date_collected
    , :OLD.patient_id
);
END;

但是,当我运行它时,我收到一个错误,说它运行成功但有错误。我检查了 user_errors 表,发现了这个:

    PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   ;

我想这一定是sql终止的错误,但我不知道如何修复它。

【问题讨论】:

  • 您应该发布完整的触发代码,准确复制/粘贴。你发的没用,不可能知道有什么问题。
  • END;之后加上斜杠(/
  • @Littlefoot 我添加了插入代码。 /应该直接在“END;”之后还是在自己的行后记?
  • 你做到了,但是 - 这不是引发错误的代码,因为它是正确编写的。我怎么知道?我测试了,现在。编译好了,没问题。请参阅我发布的答案中的演示。因此,再次:复制/粘贴报告错误的确切代码。
  • 从斜线开始:在它自己的行中。

标签: oracle plsql triggers


【解决方案1】:

如前所述,我们需要触发代码。完整的代码。

@astentx 表示缺少正斜杠;很可能不是。我猜想缺少分号(正如 OP 的错误消息所暗示的那样)。像这样的:

SQL> create or replace trigger trg_test
  2    before update on test
  3    for each row
  4  begin
  5    null                    --> semi-colon missing here
  6  end;
  7  /                         --> slash would create a trigger; without it,
                               --> cursor would just keep blinking 
Warning: Trigger created with compilation errors.

那有什么问题呢?

SQL> show err
Errors for TRIGGER TRG_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/1      PLS-00103: Encountered the symbol "END" when expecting one of the
         following:
         ;
         The symbol ";" was substituted for "END" to continue.

SQL>

对; OP报告了相同的错误。但是,要确切地知道它,我们仍然错过了确切的触发代码。


[编辑]一分钟前发布的代码没问题:

SQL> create or replace trigger TRIG_table_2
  2  BEFORE update or delete ON table_1 REFERENCING NEW AS NEW OLD AS OLD
  3  for EACH ROW
  4  BEGIN
  5  INSERT INTO table_2(
  6      id
  7      ,value
  8      ,date_collected
  9      ,patient_id
 10  ) VALUES (
 11      :OLD.id
 12      , :OLD.value
 13      , :OLD.date_collected
 14      , :OLD.patient_id
 15  );
 16  END;
 17  /

Trigger created.

SQL>

【讨论】:

  • 我设法让它工作,通过使用它并在顶部添加“DELIMITER /”。
  • 很高兴你成功了。感谢您告知我们。
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 2015-07-09
相关资源
最近更新 更多