SP2-0552:未声明绑定变量“NEW”
Posted
技术标签:
【中文标题】SP2-0552:未声明绑定变量“NEW”【英文标题】:SP2-0552: Bind Variable "NEW" is not declared 【发布时间】:2016-07-21 09:25:07 【问题描述】:我正在尝试学习 pl/sql 触发器。我正在尝试通过跟踪教程http://www.tutorialspoint.com/plsql/plsql_triggers.htm 创建一个简单的触发器,但出现以下错误。我在互联网上搜索但找不到解决方案。你能帮我解决这个问题吗?
CREATE OR replace TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON ok.customers
FOR EACH ROW
DECLARE
sal_diff NUMBER;
BEGIN
sal_diff := :NEW.salary - :OLD.salary;
END;
/
Trıgger DISPLAY_SALARY_CHANGES created.
SP2-0552: Bind Variable "NEW" is not declared.
PL/SQL procedure successfully completed.
编辑:我使用的是 Sql Developer 版本 4.1.1
【问题讨论】:
你尝试用 sqlplus 或其他东西(sql developer、plsql developer、toad)编译? @АнатолийПредеин,我使用的是 Sql Developer 版本 4.1.1 文件 -> 新建 -> 所有项目 -> Sql 文件(数据库文件) -> 和窗口中的过去代码,然后按 F5。看截图gyazo.com/0763ec50a7aa637a66305366f7bed5ee没有错误 @АнатолийПредеин,感谢您的回答,但我看到的是:i.imgur.com/yZcYCYd.png 【参考方案1】:对我有用(来自您的链接的示例,但它与您的帖子基本相同):
SQL> create table demo (id integer, salary number);
Table created.
SQL> create or replace trigger display_salary_changes
2 before delete or insert or update on demo
3 for each row
4 when (new.id > 0)
5 declare
6 sal_diff number;
7 begin
8 sal_diff := :new.salary - :old.salary;
9 dbms_output.put_line('Old salary: ' || :old.salary);
10 dbms_output.put_line('New salary: ' || :new.salary);
11 dbms_output.put_line('Salary difference: ' || sal_diff);
12 end;
13 /
Trigger created.
SQL> show errors
No errors.
SQL> insert into demo (id, salary) values (1, 100);
Old salary:
New salary: 100
Salary difference:
1 row created.
SQL> update demo set salary = salary * 1.1 where id = 1;
Old salary: 100
New salary: 110
Salary difference: 10
1 row updated.
在您的示例中显示
Trıgger DISPLAY_SALARY_CHANGES created.
这看起来不像 SQL*Plus 输出。你用的是什么工具?
之后它给出一个关于未定义绑定变量的 SQL*Plus SP2-0552
错误,然后是
PL/SQL procedure successfully completed.
那是什么程序?我怀疑这是脚本的输出,在创建触发器后其他步骤失败。
触发器有效吗?您通常可以在桌面工具中右键单击并检查属性,或在 SQL*Plus 提示符处输入
show errors trigger display_salary_changes
【讨论】:
我使用的是 Sql Developer 版本 4.1.1,我只运行上面的脚本。 触发器有效吗? 在对象浏览器中找到触发器(左侧面板,连接下方),看看它是否标有红色 X。 另外,您可以右键单击浏览器树中的触发器名称并选择“编辑”。然后它将在代码编辑器窗口中打开它,它不应该对绑定变量感到困惑。 (可能有一些方法可以将默认 SQL 工作表更改为代码编辑器,但我对 SQL Developer 不太熟悉。)【参考方案2】:试试这个:
CREATE OR replace TRIGGER test_trg
BEFORE DELETE OR INSERT OR UPDATE ON test
FOR EACH ROW
DECLARE
sal_diff NUMBER;
BEGIN
sal_diff := :new.d - :old.d;
END;
/
【讨论】:
现在:SP2-0552:未声明绑定变量“new”。 它在我的系统中得到了遵守。检查您的程序中是否还有其他问题。 我使用的是 Sql Developer 版本 4.1.1。会不会是问题? Sql developer只是访问Oracle的接口。检查您的 oracle 版本。此外,据我了解,即使是最低版本的 Oracle 也将支持此触发器。您的代码没有任何问题,您的代码必须编译和运行。如果您能说出创建此触发器的真正目的是什么,那么我想专家可以提供帮助。 @Raj_Te,这是一个学习练习。他正在尝试让 tutorialspoint.com 演示工作。【参考方案3】:请您检查一下您的列名。我在下面尝试了你的代码,我得到了输出。
create table test
(
no number(10),
sal number(10)
);
CREATE OR replace TRIGGER test_tr
BEFORE DELETE OR INSERT OR UPDATE ON test
FOR EACH ROW
DECLARE
sal_diff NUMBER;
BEGIN
sal_diff := :NEW.sal - :OLD.sal;
dbms_output.put_line(sal_diff);
END;
/
insert into test values(1,100);
update test set sal=200 where no=1;
输出:
1 rows inserted.
4 rows updated.
100
100
100
100
1 rows inserted.
【讨论】:
我使用的是 Sql Developer 版本 4.1.1,当我再次运行你的脚本时,我得到了同样的错误【参考方案4】:我认为它缺少“REFERENCING NEW AS NEW OLD AS OLD”这句话:
CREATE TRIGGER [trigger_name]
BEFORE INSERT OR UPDATE ON [table_name]
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
【讨论】:
以上是关于SP2-0552:未声明绑定变量“NEW”的主要内容,如果未能解决你的问题,请参考以下文章
为啥会显示“SP2-0552:未声明绑定变量“SEL”。”在 sql 加?