我需要更多关于此功能的帮助,该功能假设返回触发器将检索的退休日期,并使用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:at “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;
答案 0 :(得分:2)
当触发器在其拥有的表上执行DML或查询时,会发生变异触发器。你的功能就是这样做的。
好消息是该功能不需要查询EMPLOYEES_MASTER_DETAILS,因为所有必要的细节都可用于触发器:
resources/myimage.gif
触发器现在看起来像这样:
create or replace function EDOR_FUNCTION
(p_DOFA in date, p_dob in date)
return date
is
new_edor_date date;
begin
if p_dofa- p_dob <= 25 then
new_edor_date := add_months(p_dofa, 35*12);
else
new_edor_date := add_months(p_dob, 60*12);
end if;
return new_edor_date;
END;
这不仅解决了ORA-04088问题,而且还解决了业务逻辑中存在的大问题:当您的表中有多条记录时,您的原始功能将会失败。