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 加?