use*_*035 5 sql oracle oracle11g
我已经建立了这个功能,必须返回我的第一个付款到期日,基于该承诺ID的承诺.我的桌子上有每个承诺的日期,付款发生在每个月的第一天,从承诺日期后的一个月开始.我需要从匿名区块调用它...希望它足够清楚......
这是功能代码
create or replace function DD_PAYDATE1_SF (
pledge_id dd_payment.idpledge%type)
return date is
payment_date dd_payment.paydate%type;
begin
select paydate into payment_date from dd_payment
where dd_payment.idpledge = pledge_id;
return payment_date;
end DD_PAYDATE1_SF;
Run Code Online (Sandbox Code Playgroud)
我尝试了截断功能,但它似乎返回我所有后续付款 - 因为我在调用函数"精确获取返回超过请求的行数"时收到此错误 - 而我只需要他们中的第一个如何才能解决它
您需要加入具有质押日期的表(我猜pledge),过滤以仅获取此后的付款日期,并使用MIN聚合函数获取第一个日期:
create or replace function dd_paydate1_sf (
pledge_id dd_payment.idpledge%type)
return date is
payment_date dd_payment.paydate%type;
begin
select min(d.paydate)
into payment_date
from pledge p
join dd_payment d on d.idpledge = p.pledge_id
and d.paydate > p.pledge_date
where p.pledge_id = dd_paydate1_sf.pledge_id;
return payment_date;
end dd_paydate1_sf;
/
Run Code Online (Sandbox Code Playgroud)
虽然加入和过滤是否必要是值得怀疑的,因为它们意味着你可以在承诺之前付款,这实际上没有意义;MIN()因此,您只需添加到原始查询中就可能获得相同的效果。
这不会显示新承诺的第一个日期(本月收到的承诺)并将返回 null。如果您也想要这些,并且您关于接下来几个月的第一个月的规则始终正确,您可以忽略付款表并计算出它应该是什么:
create or replace function dd_paydate1_sf (
pledge_id dd_payment.idpledge%type)
return date is
payment_date dd_payment.paydate%type;
begin
select trunc(p.pledge_date, 'MM') + interval '1' month
into payment_date
from pledge p
where p.pledge_id = dd_paydate1_sf.pledge_id;
return payment_date;
end dd_paydate1_sf;
/
Run Code Online (Sandbox Code Playgroud)
给出TRUNC(<date>, 'MM')该日期所在月份的第一天,然后您可以添加一个以获得下个月的第一天。
这取决于您是否想要第一个预期付款日期,或者是实际进行第一个付款的日期(假设dd_payment记录的是已发生的实际付款)。
要获取并显示匿名块中的一个值:
declare
paydate date;
begin
paydate := dd_paydate1_sf(104);
dbms_output.put_line(to_char(paydate, 'DD/MM/YYYY'));
end;
/
Run Code Online (Sandbox Code Playgroud)