我正在尝试创建一个触发器,该触发器在更新其他列时更新表中的列。但是在保存触发器时出现以下错误
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;
答案 0 :(得分:1)
虽然 IF
是 WHEN
的替代,但我认为最好尽可能使用 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。