寻找最高价值

时间:2016-08-05 13:49:21

标签: sql database postgresql plpgsql

我有一个函数,它接受两个值并返回setof记录,正如我的作业所要求的那样。

现在我有一个不同的问题,我想采用这个功能,但不是返回一个setof记录,我想要其中一个选项,无论更容易:

  • 返回一张桌子而不是一套。
  • 在调用函数(名为“temp”的表)之前创建一个表,用值填充它。

这是我的功能,需要一个月和一年作为参数,并返回一个律师必须给他那个月和一年工作的文件的付款:

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;

1 个答案:

答案 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;

注意,我更改了函数名称以便于测试(没有名称冲突)。如有必要,请更改列类型以适合您的模型。