我需要更多关于此功能的帮助,该功能假设返回由触发器检索的退休日期,并使用DOFA“hire_date”中的值更新EMPLOYEES_MASTER_DETAILS表上的EDOR“退休日期”列 .
函数和触发器编译成功 . 但每当我更新记录时,我都会收到此错误消息......!
发生> 1错误ORA-04091:表DBA_AUWAL.EMPLOYEES_MASTER_DETAILS正在变异,触发/功能可能看不到它ORA-06512:在“DBA_AUWAL.EDOR_FUNCTION”,第9行ORA-06512:在“DBA_AUWAL.EDOR_FUNCTION”,第17行ORA -06512:在“DBA_AUWAL.EDOR_IN_TRG”,第2行ORA-04088:执行触发器'DBA_AUWAL.EDOR_IN_TRG'时出错
我的功能是
create or replace function EDOR_FUNCTION(DOFA in date)
return date
is
dofa_date date;
dob_date date;
new_edor_date date;
cursor c1 is
SELECT DOFA
FROM EMPLOYEES_MASTER_DETAILS;
cursor c2 is
SELECT date_of_birth
FROM EMPLOYEES_MASTER_DETAILS;
BEGIN
open c1;
fetch c1 into dofa_date;
close c1;
open c2;
fetch c2 into dob_date;
close c2;
if dofa_date - dob_date <= 25 then new_edor_date := add_months(dofa_date, 35*12);
else new_edor_date := add_months(dob_date, 60*12);
end if;
return new_edor_date;
END;
这是触发器
create or replace TRIGGER EDOR_IN_TRG
before INSERT OR UPDATE ON EMPLOYEES_MASTER_DETAILS
FOR EACH ROW
BEGIN
:new.EDOR := EDOR_FUNCTION(:new.DOFA);
END;
1 回答
当触发器在其拥有的表上执行DML或查询时,会发生变异触发器 . 你的功能是这样做的 .
好消息是该函数不需要查询EMPLOYEES_MASTER_DETAILS,因为触发器可以使用所有必要的细节:
触发器现在看起来像这样:
这不仅解决了ORA-04088问题,而且还解决了业务逻辑中存在的巨大问题:当您的表中有多条记录时,您的原始功能将会失败 .