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

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

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

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

这个程序有啥错误?

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