2017-04-03 299 views
0

請使用函數在使用觸發器檢索結果之前計算僱員從其首次約會日期中退休,並將其存儲在Retirement日期列中:但我不太好語法請可以有人幫忙:......下面是我對功能Oracle SQL中的退休日期函數

CREATE OR REPLACE Function EDOR_DATE 
(DOFA IN date) 
RETURN date 
IS 
NEW_EDOR_RESULT date; 

BEGIN 

SELECT DOFA + ((365*35) + 9) as NEW_EDOR 
FROM EMPLOYEES_MASTER_DETAILS; 

fetch NEW_EDOR into NEW_EDOR_RESULT; 

RETURN NEW_EDOR_RESULT; 

END; 
+0

這是我的原始碼 – Auwal

回答

0
CREATE OR REPLACE Function EDOR_DATE 
(DOFA date) 
RETURN date 
IS 
NEW_EDOR_RESULT date; 

BEGIN 
--I am converting this to a case statement that is easier to read 
select 
case 
when dofa - dob <= 25 then dofa + ((365*35)+9) 
else dob + ((365*60)+9) 
end 
into new_edor_result 
from employees_master_details; 

return new_edor_result; 
end; 
+0

Thanks @fleetmack – Auwal

0

這可以無需使用一個函數來完成的代碼。另外,你爲什麼增加幾天?一年不是365天。您應該使用add_months()功能。

這裏是我會怎麼做這個,假設有問題的所有列屬於EMPLOYEES_MASTER_DETAILS表:

select emp_id, 
     dob, 
     hire_date, 
     case when months_between(hire_date, dob) <= 25 * 12 then add_months(hire_date, 35*12) 
      else add_months(dob, 60*12) 
     end retirement_date 
from EMPLOYEES_MASTER_DETAILS emd; 

如果你需要計算插入時退休,然後只需使用的情況下表達的一部分插入語句。你表明你對功能所做的更改

1

首先一對夫婦的意見:

  1. 從聲明中刪除了「IN」實際上無所作爲。 如果您沒有指定「IN」,「OUT」或「IN OUT」,編譯器將默認爲「IN」,所有刪除操作都是從顯式更改爲隱式聲明
  2. 放置一個分號;),其中指出將產生一個錯誤

至於你正在它的方式比需要更復雜的功能本身就是一個簡單的分配是所有的需要另外,ADD_MONTHS的Boneist的建議是將正確的函數。因爲它會調整閏年和每月的天數(如果需要)。

因此,您的功能降低到:

create or replace function edor_date(dofa in date) 
return date 
is 
    l_edor_date date; 
begin 
    l_edor_date := add_months(dofa, 35*12) ; 
    return l_edor_date ; 
end; 

甚至更​​遠的只是:

create or replace function edor_date (dofa in date) 
return date 
is 
begin 
    return add_months(dofa, 35*12) ; 
end; 

BTW:其實我喜歡,因爲它隱藏了業務規則的實施細節使用函數此的想法。但是,它確實爲每次通話帶來了輕微的開銷。