现在需求如下:
有一个员工表,给员工加工资的时候需要给经理也加工资,而经理也算员工,所以和一般员工是在一张表里
这样的话触发器里就肯定要涉及到员工表的修改,然而该触发器就是由对员工表的修改触发的,所以会造成递归问题报错
ORA-04091: table SCOTT.LOBATT_EMP is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.LOBATT_EMP_AUR", line 8
ORA-04088: error during execution of trigger 'SCOTT.LOBATT_EMP_AUR'请问又没有什么办法可以让我在触发器里修改触发该触发器的表?
有一个员工表,给员工加工资的时候需要给经理也加工资,而经理也算员工,所以和一般员工是在一张表里
这样的话触发器里就肯定要涉及到员工表的修改,然而该触发器就是由对员工表的修改触发的,所以会造成递归问题报错
ORA-04091: table SCOTT.LOBATT_EMP is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.LOBATT_EMP_AUR", line 8
ORA-04088: error during execution of trigger 'SCOTT.LOBATT_EMP_AUR'请问又没有什么办法可以让我在触发器里修改触发该触发器的表?
AFTER INSERT
ON GA.GAT_BASE_LIST
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
...
END;
這是行級觸發器,
而且一般的是
CREATE OR REPLACE TRIGGER GA.TEST
AFTER INSERT
ON GA.GAT_BASE_LIST
REFERENCING NEW AS NEW OLD AS OLD
DECLARE
BEGIN
...
END;
create sequence sequencename
start with 1
increment by 1
由1开始每次增加1在修改表的时候用sequencename.nextval
exqmple:
create table(a number(10))
insert into table values(sequencename.nextval);
每次使用调用一次,sql不掉用不增加
AFTER
UPDATE OF "SALARY" ON "EMP"
FOR EACH ROW
DECLARE
rise NUMBER := :new.salary - :old.salary;
dept VARCHAR(20) := :old.dept_name;
m_name VARCHAR(20);
BEGIN
IF(rise > 0) THEN
select manager into m_name from dept where dept_name = dept;
IF(:old.ename != m_name) THEN
update emp set salary = salary + rise*0.1 where ename = m_name;
update dept set budget = budget + rise*1.1 where dept_name = dept;
ELSE
update dept set budget = budget + rise where dept_name = dept;
END IF;
END IF;
END;
以上是我的触发器,作用是当给一个员工加工资的时候
自动给他的经理加他工资的10%,然后把部门预算也加上相应的值但是我的触发器在执行dept表的更新的时候没问题,执行emp表的更新的时候却报错
因为就是对emp标的更新触发了该触发器所以我怀疑如果在触发器里执行将会触发该触发器的语句是有问题的
要么oracle不支持
要么就需要特别的途径...
现在就是想不出来要用什么途径...