退休日期功能和TRIGGER

时间:2017-04-05 14:32:47

标签: sql oracle plsql

我需要更多关于此功能的帮助,该功能假设返回触发器将检索的退休日期,并使用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;

1 个答案:

答案 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问题,而且还解决了业务逻辑中存在的大问题:当您的表中有多条记录时,您的原始功能将会失败。