我已经构建了这个函数,它必须返回基于该质押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;
我尝试了trunc函数,但它似乎返回我所有随后的付款-当我收到这个错误时,调用函数"准确获取返回超过请求的行数"-而我只需要第一个
您需要加入具有质押日期(我猜是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;
/
SQL小提琴。
虽然这是值得怀疑的,如果连接和过滤器是必要的,因为它们意味着你可以有一个付款之前,你承诺,这真的没有意义;所以你可能会得到相同的效果,只是通过添加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;
/
TRUNC(<date>, 'MM')
给出该日期所在月份的第一天,然后您可以添加一个以获得下个月的第一天。
SQL小提琴。
这取决于您是想要第一次预期付款日期,还是第一次实际付款的日期,假设dd_payment
正在记录已经发生的实际付款。
获取并显示匿名块中的一个值:
declare
paydate date;
begin
paydate := dd_paydate1_sf(104);
dbms_output.put_line(to_char(paydate, 'DD/MM/YYYY'));
end;
/
您必须更改select语句。如果你想要第一个,你可以这样做:
select paydate
into payment_date
from
(select paydate
from dd_payment
where dd_payment.idpledge = pledge_id
order by paydate)
where rownum = 1;