2017-04-03 37 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:其实我喜欢,因为它隐藏了业务规则的实施细节使用函数此的想法。但是,它确实为每次通话带来了轻微的开销。