2017-04-05 43 views
0

請使用此函數需要更多幫助,該函數假設返回將由觸發器檢索的退休日期,並使用DOFA中的值更新EMPLOYEES_MASTER_DETAILS表上的EDOR「退休日期」 hire_date「退休日期FUNCTION和TRIGGER

函數和觸發器已成功編譯。但是,每當我更新記錄時,我都會收到此錯誤消息...!已經發生

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'

My功能執行期間是

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

試着讓你的觸發器成爲'之後'而不是'之前',或者將這個邏輯移入一個存儲過程。 - [引用這個問題w /你的錯誤](http://dba.stackexchange.com/a/5439/36762) –

回答

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問題,它也解決了業務邏輯中的整體問題:當您的表中有多條記錄時,原始函數將會失敗。

+0

非常感謝我們非常有幫助@APC – Auwal