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

时间:2021-06-11 22:06:00

标签: sql oracle plsql

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

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;

2 个答案:

答案 0 :(得分:1)

虽然 IFWHEN 的替代,但我认为最好尽可能使用 WHEN 子句,因为它是一个

<块引用>

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

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

是的,WHEN 子句有其限制,您不能将任何东西放入其中,但是 - 您的情况不是其中之一。

(在 Documentation 中有更多信息,搜索“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>

答案 1 :(得分:0)

我认为您可以尝试将 WHEN 条件更新为 IF 语句以及其他一些更改 -

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

这是fiddle

相关问题