将多次调用相同函数的结果组合在一起

时间:2016-01-04 09:42:31

标签: sql postgresql

我有一个功能func1(integer); 它返回行:partid,qty 例如: select * from func1(1);

partid,qty
 10     50
 20     30

select * from func1(2);

partid,qty
 10     5
 20     30
 11     10

我需要编写一个函数,通过结果调用func1和数组。 func2(integer[]);

例如: select * from func2(array[1,2]);应该给出:

partid,qty
 10     55
 20     60
 11     10

我写了这个:

CREATE OR REPLACE FUNCTION func2(listx integer[])
  RETURNS SETOF records_d AS
$BODY$
declare
    item integer;
begin
    foreach item in array listx loop
        select * from func1(item);

    end loop;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

record_d是类型(整数,整数)

这个函数不起作用...我不知道如何结合func1()的不同迭代结果,然后返回它们。

2 个答案:

答案 0 :(得分:1)

您不需要其他功能,您可以在一个SQL语句中执行此操作:

select f.partid, sum(f.qty)
from unnest(array[1,2]) i, func1(i) f
group by f.partid;

SQLFiddle示例:http://sqlfiddle.com/#!15/8b083/1

答案 1 :(得分:0)

因为它经常使用postgres,它有RETURN NEXT子句,这正是你想要的。

我认为您必须调整代码以将innes select的结果转换为records_d类型。但是RETURN NEXT就是你想要的。

CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS
$BODY$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN SELECT * FROM foo
    WHERE fooid > 0
    LOOP
        -- can do some processing here
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;