首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle触发器:新前缀Colon (:)

Oracle触发器:新前缀Colon (:)
EN

Stack Overflow用户
提问于 2021-05-14 16:49:16
回答 1查看 288关注 0票数 0

这里我找到了以下示例

代码语言:javascript
复制
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有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-14 16:55:16

从文件中

在简单触发器的trigger_body或复合触发器的tps_body中,关联名称是绑定变量的占位符。使用以下语法引用伪记录的字段: :pseudorecord_name.field_name 在条件触发器的WHEN子句中,关联名称不是绑定变量的占位符。因此,在前面的语法中省略冒号。

所以这行中没有冒号:

代码语言:javascript
复制
WHEN (new.Empno > 0)

但你在身体上却是这样,例如:

代码语言:javascript
复制
sal_diff  := :new.sal  - :old.sal;

触发器有时会引起混淆,因为它们分为两部分;本质上是SQL/DDL部分,在您的示例中是:

代码语言:javascript
复制
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主体,在您的例子中,它从以下几个方面开始:

代码语言:javascript
复制
DECLARE

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

代码语言:javascript
复制
BEGIN

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

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

https://stackoverflow.com/questions/67538037

复制
相关文章

相似问题

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