Oracle在when子句中触发多个条件

迈克尔·爱德华兹

我正在尝试创建一个触发器,该触发器在更新其他列时更新表中的列。但是在保存触发器时出现以下错误

ORA-25000: invalid use of bind variable in trigger WHEN clause

我的触发器如下,我不确定代码有什么问题。

CREATE OR REPLACE TRIGGER  Employees_ARIU 
BEFORE  INSERT OR  UPDATE ON Employees 
FOR EACH ROW
WHEN ((nvl(:OLD.EMP_SAL,0) != nvl(:NEW.EMP_SAL,0)) OR (nvl(:OLD.SAL_LEVEL,0) != nvl(:NEW.SAL_LEVEL,0)))
BEGIN
        :NEW.LAST_UPDATED = SYSDATE
END;
小脚怪

虽然IF是 的替代方案WHEN,但我认为最好尽可能使用WHEN子句,因为它是

数据库触发触发器必须满足的 SQL 条件

那么,你为什么要让触发器触发然后得出结论,哦,好吧,毕竟我不想做任何事情最好不要运行它!

是的,WHEN条款有其限制,您不能在其中任何东西,但是 - 您的情况不是其中之一。

文档中的更多信息,搜索“WHEN 子句”)。

因此,对于示例表

SQL> create table employees
  2    (id           number,
  3     emp_sal      number,
  4     sal_level    number,
  5     last_updated date);

Table created.

触发器看起来像这样:

SQL> create or replace trigger employees_ariu
  2    before insert or update on employees
  3    for each row
  4    when (   nvl(old.emp_sal, 0)   <> nvl(new.emp_sal, 0)
  5          or nvl(old.sal_level, 0) <> nvl(new.sal_level, 0)
  6         )
  7  begin
  8    :new.last_updated := sysdate;
  9  end;
 10  /

Trigger created.

测试:

SQL> insert into employees (id, emp_sal, sal_level) values (1, 100, 1);

1 row created.

SQL> select * from employees;

        ID    EMP_SAL  SAL_LEVEL LAST_UPDATED
---------- ---------- ---------- -------------------
         1        100          1 12.06.2021 12:14:17

SQL> update employees set sal_level = 2 where id = 1;

1 row updated.

SQL> select * from employees;

        ID    EMP_SAL  SAL_LEVEL LAST_UPDATED
---------- ---------- ---------- -------------------
         1        100          2 12.06.2021 12:14:33

SQL>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章