2017-04-03 15 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

ありがとう@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; 

あなたは、挿入時に退職を計算する必要がある場合は、単にの一部として、ケース式を使用しますinsertステートメントあなたが機能に対して行った指示の変更に

1

最初のカップルのコメント:

  1. 宣言から「IN」を削除するには、実際には何も達成していません。 "IN"、 "OUT"、または "IN OUT"を指定しないと、コンパイラのデフォルトは "IN"になります。 ;)は、エラーが発生する場合があります。

機能自体は、必要以上に複雑になっています。単純な割り当てがすべて必要です。また、ボーンリストのadd_monthsの提案は、 (必要に応じて)うるう年と月の日数を調整します。

したがって、関数は次のようになります。

ただへ
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; 

ところで:私実際にそれがビジネスルールの実装の詳細を隠蔽し、このための機能を使用してのアイデアのように。しかし、それは各コールにわずかなオーバーヘッドを課します。