首页 > 解决方案 > Oracle 触发器:当带有冒号 (:) 的前缀 NEW

问题描述

在这里我找到了以下示例

CREATE OR REPLACE TRIGGER Print_salary_changes
  BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab
  FOR EACH ROW
WHEN (new.Empno > 0)
DECLARE
    sal_diff number;
BEGIN
    sal_diff  := :new.sal  - :old.sal;
    dbms_output.put('Old salary: ' || :old.sal);
    dbms_output.put('  New salary: ' || :new.sal);
    dbms_output.put_line('  Difference ' || sal_diff);
END;
/

WHENI write newwhile after BEGINI write之内:newnew和有什么区别:new

标签: oracleplsqltriggers

解决方案


从文档中

在简单触发器的 trigger_body 或复合触发器的 tps_body 中,相关名称是绑定变量的占位符。使用以下语法引用伪记录的字段:

:pseudorecord_name.field_name

WHEN条件触发器的子句中,相关名称不是绑定变量的占位符。因此,请省略上述语法中的冒号。

所以你在这一行没有冒号:

WHEN (new.Empno > 0)

但是你在体内做,例如:

sal_diff  := :new.sal  - :old.sal;

触发器有时会引起混淆,因为它们分为两部分;本质上是一个 SQL/DDL 部分,在您的情况下是:

CREATE OR REPLACE TRIGGER Print_salary_changes
  BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab
  FOR EACH ROW
WHEN (new.Empno > 0)

然后是 PL/SQL 主体,在您的情况下从以下位置开始:

DECLARE

但在其他情况下,不会有声明部分,然后它将从

BEGIN

当触发器出现编译错误时,报告的 PLS 错误的行号从 PL/SQL 部分的开头开始计算,而不是形成CREATE- 这可能会令人困惑......


推荐阅读