首页 文章

退休日期功能和触发器

提问于
浏览
0

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

  • 2

    当触发器在其拥有的表上执行DML或查询时,会发生变异触发器 . 你的功能是这样做的 .

    好消息是该函数不需要查询EMPLOYEES_MASTER_DETAILS,因为触发器可以使用所有必要的细节:

    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;
    

    触发器现在看起来像这样:

    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, :NEW.DOB);
    END;
    

    这不仅解决了ORA-04088问题,而且还解决了业务逻辑中存在的巨大问题:当您的表中有多条记录时,您的原始功能将会失败 .

相关问题