SP2-0552:未声明绑定变量 "NEW" 和 END 错误报告 - 未知命令
SP2-0552: Bind variable "NEW" not declared and END Error report - Unknown Command
我必须为我创建的 table 和插入更新编写一个触发器,我必须为更新或插入的那些记录一个单独的日志 table。
日志中的列 table 会像;
- Done_process(会写更新,插入)
- 人(被治疗者学号)
- 之前(更新的前值,插入的空白)
- 之后(更新的新值,插入的新值)
这是我的 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 子句用于比较值,因此您应该使用 =
而不是 :=
,这是一个赋值运算符。
除了这个问题还有几点需要注意
- 给出创建局部变量的明确约定。例如您已经创建了一个局部变量
v_id
,并且同一列在 student_info
table 中也可用。虽然在这种情况下这不是问题,但是保持局部变量特定是一种很好的做法,比如 l_v_id
.
- 您在触发器中使用了 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 工作表,然后按照我在下图中所示的方式进行操作。请尝试让我知道。
我必须为我创建的 table 和插入更新编写一个触发器,我必须为更新或插入的那些记录一个单独的日志 table。
日志中的列 table 会像;
- Done_process(会写更新,插入)
- 人(被治疗者学号)
- 之前(更新的前值,插入的空白)
- 之后(更新的新值,插入的新值)
这是我的 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 子句用于比较值,因此您应该使用 =
而不是 :=
,这是一个赋值运算符。
除了这个问题还有几点需要注意
- 给出创建局部变量的明确约定。例如您已经创建了一个局部变量
v_id
,并且同一列在student_info
table 中也可用。虽然在这种情况下这不是问题,但是保持局部变量特定是一种很好的做法,比如l_v_id
. - 您在触发器中使用了 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 命令
删除两个 tablesdrop table STUDENT_INFO;
drop table og_log;
第二步:
使用 alt+F10
打开另一个 SQL 工作表,然后按照我在下图中所示的方式进行操作。请尝试让我知道。