首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SP2-0552:未声明绑定变量"NEW“

SP2-0552:未声明绑定变量"NEW“
EN

Stack Overflow用户
提问于 2016-07-21 17:25:08
回答 4查看 11K关注 0票数 2

我正在尝试学习pl/sql触发器。我试图通过跟踪教程http://www.tutorialspoint.com/plsql/plsql来创建一个简单的触发器,但是我得到了下面的错误。我在网上搜索,但找不到解决方案。你能在这个问题上帮我吗?

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-21 18:33:46

适用于我(你的链接中的例子,但它与你的帖子基本相同):

代码语言:javascript
复制
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.

在您的示例中,它显示了

代码语言:javascript
复制
Trıgger DISPLAY_SALARY_CHANGES created.

这看起来不像SQL*Plus输出。你用的是什么工具?

之后,它会给出一个关于未定义绑定变量的SQL*Plus SP2-0552错误,然后是

代码语言:javascript
复制
PL/SQL procedure successfully completed.

那是什么程序?我怀疑这是一个脚本的输出,其中包含在创建触发器后失败的其他步骤。

触发器有效吗?通常可以在桌面工具中右键单击并检查属性,或者在SQL*Plus提示符下输入

代码语言:javascript
复制
show errors trigger display_salary_changes
票数 1
EN

Stack Overflow用户

发布于 2016-07-21 17:36:38

试试这个:

代码语言:javascript
复制
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; 
/ 
票数 1
EN

Stack Overflow用户

发布于 2016-07-21 18:24:31

请检查您的列名。我已经尝试了你下面的代码,我得到了输出。

代码语言:javascript
复制
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;

输出:

代码语言:javascript
复制
1 rows inserted.


4 rows updated.
100
100
100
100

1 rows inserted.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38500184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档