Table1
Emp_no|| end_date || col2 || Sent date
只要在此表中输入详细信息,此表将发送特定员工的详细信息,并且发送日期列将更新为sysdate。
现在第二次运行时,我必须检查是否是在15天内发送给同一员工的邮件?如果是,那么该行将不会在table1中更新。即我必须比较最新发送日期和sysdate。为此,我正在使用一个功能
create or replace Function last_mail_sent(p_emp_no number,pay_period_end_date date)
return number
is
begin
select trunc(sysdate)-trunc(sent_date)
into
l_days
from table1
where emp_no=p_emp_no
and sent_date=(select max(sent_date) from tabl1
where emp_no=p_emp_no
and trunc(end_date)=trunc(pay_period_end_date );
exception when no_data_found
then
l_days :=0;
else
when others then
l_days:=-1;
end;
return l_days;
end;
/
我试图在我使用此函数来决定是否插入的包中使用的逻辑是:
l_last_mail_sent := last_mail_sent(pass the parameter by fetching cols from cursor)
if l_last_mail_sent=0 (That is no row is fetched from the function)
or l_last_mail_sent>15
then
insert into Table1
else
--do not insert
end if;
但上述查询的问题是。例如,如果表今天更新了sent_date列已使用今天的日期更新,那么函数将返回0.是否有更好的逻辑可以形成? P.S:我必须创建一个处理这个的函数,因为它可以重用。
答案 0 :(得分:0)
select trunc(sysdate) - trunc(max(sent_date))
into l_days
from table1
where emp_no = p_emp_no
and end_date between trunc(pay_period_end_date) and trunc(pay_period_end_date) + 1 - 1/24/60/60;
(此查询不会引发任何异常,因此您不需要捕获任何内容) 我已经改变了一点条件,所以你可以在end_date上使用索引(如果有的话)
然后
if l_last_mail_sent is null or l_last_mail_sent > 15 then
--insert into Table1
else
--do not insert
end if;