我有一个函数,它接受两个值并返回setof记录,正如我的作业所要求的那样。
现在我有一个不同的问题,我想采用这个功能,但不是返回一个setof记录,我想要其中一个选项,无论更容易:
这是我的功能,需要一个月和一年作为参数,并返回一个律师必须给他那个月和一年工作的文件的付款:
create or replace function calcbilling( cmonth int, cyear int) returns setof record
as $$
declare r record;
begin
for r in(select billing.fid, billing.lname, (lawyer.hbilling*billing.hours) as totpay
from billing natural join lawyer
where date_part('month',billing.bdate)=cmonth and date_part('year',billing.bdate)=cyear)
loop
return next r;
end loop;
end;
$$language plpgsql;
答案 0 :(得分:1)
函数返回表比原始函数更简单(当然更方便):
create or replace function calc_billing(cmonth int, cyear int)
returns table (fid integer, lname text, totpay numeric)
as $$
begin
return query
select b.fid, b.lname, l.hbilling* b.hours as totpay
from billing b
natural join lawyer l
where
date_part('month', b.bdate) = cmonth
and date_part('year', b.bdate) = cyear;
end;
$$language plpgsql;
-- use:
select * from calc_billing(1, 2016);
sql(而不是plpgsql)变体甚至更简单:
create or replace function calc_billing(cmonth int, cyear int)
returns table (fid integer, lname text, totpay numeric)
as $$
select b.fid, b.lname, l.hbilling* b.hours as totpay
from billing b
natural join lawyer l
where
date_part('month', b.bdate) = cmonth
and date_part('year', b.bdate) = cyear;
$$language sql;
注意,我更改了函数名称以便于测试(没有名称冲突)。如有必要,请更改列类型以适合您的模型。