SP2-0552:未声明绑定变量 "NEW" 和 END 错误报告 - 未知命令

SP2-0552: Bind variable "NEW" not declared and END Error report - Unknown Command

我必须为我创建的 table 和插入更新编写一个触发器,我必须为更新或插入的那些记录一个单独的日志 table。

日志中的列 table 会像;

这是我的 student_info table,

CREATE TABLE student_info (
    school_id NUMBER,
    id_no NUMBER NOT NULL UNIQUE,
    name VARCHAR2(50) NOT NULL,
    surname VARCHAR2(50) NOT NULL,
    city VARCHAR2(50) NOT NULL,
    birth_date DATE NOT NULL,
    CONSTRAINT student_info_pk PRIMARY KEY(school_id )
);

CREATE TABLE og_log(
        done_process VARCHAR2(30),
        person VARCHAR2(30),
        before VARCHAR2(30),
        after VARCHAR2(30)
    );

CREATE OR REPLACE TRIGGER og_trigger
BEFORE INSERT OR UPDATE OR DELETE ON student_info
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
ENABLE
DECLARE
BEGIN
   IF INSERTING THEN 
      INSERT INTO og_log(done_process, person, before, after)
       VALUES ('Insert',:new.school_id,:old.name,:new.name);
   ELSIF UPDATING THEN
     INSERT INTO og_log(done_process, person, before, after)
       VALUES ('Update',:new.school_id,:old.name,:new.name);
   END IF;
END;
/

当我尝试 运行 代码时,出现如下错误;

> Trıgger OG_TRIGGER created.
> 
> 
> Error starting at line : 280 in command - ELSIF UPDATING THEN Error
> report - Unknown Command
> 
> SP2-0552: Bind variable "NEW" not declared.
> 
> 0 rows inserted.
> 
> 
> Error starting at line : 283 in command - END IF Error report -
> Unknown Command
> 
> SP2-0044: For a list of known commands enter HELP and to leave enter
> EXIT.
> 
> Error starting at line : 284 in command - END Error report - Unknown
> Command

我相信您创建此触发器是为了学习目的,而不是真正的用例,因为您在触发器中所做的事情没有任何意义。

您提到的触发器由于 where v_id := 20201033.

等语法问题而无法编译

Where 子句用于比较值,因此您应该使用 = 而不是 :=,这是一个赋值运算符。

除了这个问题还有几点需要注意

  1. 给出创建局部变量的明确约定。例如您已经创建了一个局部变量 v_id,并且同一列在 student_info table 中也可用。虽然在这种情况下这不是问题,但是保持局部变量特定是一种很好的做法,比如 l_v_id.
  2. 您在触发器中使用了 select 语句,这可能会导致 NO_DATA_FOUND 错误,您应该在异常部分或其他方式处理它,例如使用聚合函数 [=19] =] 如果显然 v_id 是主键。 我怀疑你为什么需要这个 select 声明(如果我理解你的话,你可以在旧的和新的之间使用 coalesce(:old.school_id,:new_schoold_id) 之类的东西)但我会把它留给你来决定和行动因此.

考虑到以上几点,最终代码将是,

CREATE OR REPLACE TRIGGER og_trigger
BEFORE INSERT OR UPDATE OR DELETE ON student_info
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
ENABLE
DECLARE
BEGIN
   IF INSERTING THEN 
      INSERT INTO og_log(done_process, person, before, after)
       VALUES ('Insert',:new.school_id,:old.city,:new.city);
   ELSIF UPDATING THEN
     INSERT INTO og_log(done_process, person, before, after)
       VALUES ('Update',:new.school_id,:old.city,:new.city);
   END IF;
END;
/

查找演示 db<>fiddle



已编辑:解决可能的工具问题

我怀疑问题出在 SQL 开发者工具的使用上,但是我想做最后一次尝试,

第一步: 通过发出 drop 命令

删除两个 tables
drop table STUDENT_INFO;
drop table og_log;

第二步: 使用 alt+F10 打开另一个 SQL 工作表,然后按照我在下图中所示的方式进行操作。请尝试让我知道。