oracle - 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
I write new
while after BEGIN
I write之内:new
。new
和有什么区别: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
- 这可能会令人困惑......
推荐阅读
- php - php使用正则表达式从数组中删除元素
- r - “match.arg(what) 中的错误:'arg' 必须为 NULL 或字符向量”尝试在以下代码中运行 impute 函数时
- javascript - 如何找出并更改在 asp.net 中?
- java - 如何使用 gluon moblie 在 android 中打开文件选择器?
- python - 当列包含多个值时,在 pandas 的数据框中计算员工出现次数
- loopbackjs - 环回过滤日期的年份
- html - 我想延迟我的 div 上的动画,以便它们可以一个接一个地出现,我该怎么做?
- java - 我没有使用 XML 的经验。我如何理解这个 XML 文件中写的内容?
- javascript - SharePoint Online:上传附件 - javascript
- youtube - YouTube API v3 搜索列表 - 查询多个频道 ID 不起作用