我想在使用触发器检索结果之前使用函数计算员工从其首次约会日期退休并将其存储在Retirement
日期列中:但我对语法不满意请有人帮忙:...下面是我的功能代码
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 :(得分:1)
首先评论您对该功能所做的更改:
至于功能本身,你会让它变得比必要的复杂。只需要一个简单的任务即可。另外,Boneist建议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;
BTW:我实际上喜欢使用函数的想法,因为它隐藏了业务规则的实现细节。但是,它确实会给每次通话带来轻微的开销。
答案 1 :(得分: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;
答案 2 :(得分: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;
如果需要在插入时计算退出,那么只需将case表达式用作insert语句的一部分。