SP2-0552:未声明绑定变量“NEW”并且 END 错误报告 - 未知命令

Posted

技术标签:

【中文标题】SP2-0552:未声明绑定变量“NEW”并且 END 错误报告 - 未知命令【英文标题】:SP2-0552: Bind variable "NEW" not declared and END Error report - Unknown Command 【发布时间】:2020-08-19 22:33:25 【问题描述】:

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

日志表中的列会是这样的;

Done_process(将写入更新、插入) 人员(治疗人员的学号) 之前(之前的值用于更新,空白用于插入) 之后(更新的新值,插入的新值)

这是我的student_info 表,

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

【问题讨论】:

向我们展示您的student_info 表的描述 @SayanMalakshinov 我编辑了我的问题,现在你可以看到我的student_info 表。 【参考方案1】:

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

您提到的触发器由于 where v_id := 20201033 等语法问题而无法编译。

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

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

    为创建局部变量给出明确的约定。例如您已经创建了一个局部变量 v_id 并且同一列在 student_info 表中也可用。虽然在这种情况下这不是问题,但最好保持局部变量的特定性,例如 l_v_id。 您在触发器中使用了一个 select 语句,这可能导致 NO_DATA_FOUND 错误,您应该在异常部分中处理它,或者如果显然 v_id 是主键,则另一种方式是使用像 max() 这样的聚合函数. 我怀疑你为什么需要这个 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 Developer 工具的使用上,但我想最后一次尝试,

第一步: 通过发出 drop 命令删除两个使用的表

drop table STUDENT_INFO;
drop table og_log;

第二步: 使用alt+F10 打开另一个 SQL 工作表并按照下图所示进行操作。请尝试告诉我。

【讨论】:

我想在人员列中打印学生的 ID,但在您的演示中,我没有看到。此外,v_id 不在 student_info 表中。简单地说,我想做的是插入 1 个学生,我想显示这个学生的 id。我希望我能很好地向你解释我的问题。 不,你没有。我不知道你为什么要。你说的打印是什么意思?如果您只需要打印,则可能不需要触发器。在您的原始问题中,您确实在 select 子句中选择 school_id 而不是 student_id 并插入到 og_log 表的 person 列中。如果v_id 不在表中,为什么要添加where clause ***Simply, what I want to do is made insertion in 1 student and I want to show this student's id. I hope I explained my question well to you***:我不知道你的意思是什么?如果您只是想插入并显示,那么为什么需要 trigger ?我想通过我在您的代码中看到的内容以及您的想法来提供帮助,这就是您必须正确提出问题的原因。 我想编写一个触发器,可以插入或更新我创建的列,并且我想存储在 og_log 中。而且我还尝试写一个特定的学校ID来显示我在做什么,我希望她/他的学校号码出现在人员列中。 或者,当您在以前的 cmets 中说 Trıgger OG_TRIGGER created. Error starting at line : 280 in command - ELSIF UPDATING THEN Error report........ 输入 show errors 并检查.....

以上是关于SP2-0552:未声明绑定变量“NEW”并且 END 错误报告 - 未知命令的主要内容,如果未能解决你的问题,请参考以下文章

为啥会显示“SP2-0552:未声明绑定变量“SEL”。”在 sql 加?

如何解决 SP2-0552:未声明绑定变量?

SP2-0552:未声明绑定变量“N3”

sqlplus pl/sql Date/Time 用户输入理解为绑定变量

这个程序有啥错误?

用于在表上自动生成 ID 的序列和触发 PL/SQL 脚本