【问题标题】:Retirement Date FUNCTION and TRIGGER退休日期 FUNCTION 和 TRIGGER
【发布时间】:2017-04-05 14:32:46
【问题描述】:

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

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

当触发器在其拥有的表上执行 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 问题,还解决了您的业务逻辑中的漏洞:当您的表中有多个记录时,您的原始函数将严重失败。

【讨论】:

  • 非常感谢我们非常有帮助@APC
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多