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;
/

WHEN内写入new,而在BEGIN之后写入:newnew:new有什么区别

来自文档:

在简单触发器的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-这可能会令人困惑。。。

最新更新