我有一个函数func1(ID int)
,它返回给定ID的行。
我有另一个函数func2(IDs int[])
,它获取一个ID数组并使用循环为每个ID调用func1
,最后它应该结合所有结果并返回它。
两个函数都返回SETOF y
,因此它们的列模式兼容。
我想要做的是在func2()
的循环中合并结果。如果它在同一个SQL查询中,我只需使用UNION
,但结果来自一个函数。
CREATE OR REPLACE FUNCTION func2(IDs integer[]) RETURNS SETOF y AS
$BODY$
declare
a_id int;
r y;
begin
FOREACH a_id IN ARRAY $1
LOOP
SELECT * into r FROM func1(a_id) ;
//CODE TO ENTER FOR UNION EACH ITERATION WITH THE LAST ONE
END LOOP;
return;
end;
$BODY$ LANGUAGE plpgsql VOLATILE
r
应包含对func1()
的单次调用的结果。如何组合所有r
并返回它们?
简单来说,它应该执行:func1(1st ID) UNION func1(2nd ID) UNION ... UNION func1(nth ID)
并将其返回给曾经调用func2(IDs int[])
的人。
答案 0 :(得分:1)
由于func1()
返回一个集合,您可以在简单查询中将其用作表源。在func2()
中,它返回一组相同的行类型,您可以迭代数组值并调用func1()
并将返回的集合添加到当前函数的结果集中:
CREATE OR REPLACE FUNCTION func2(IDs integer[]) RETURNS SETOF y AS $BODY$
DECLARE
a_id int;
BEGIN
FOREACH a_id IN ARRAY $1
LOOP
RETURN QUERY SELECT * FROM func1(a_id);
END LOOP;
RETURN;
END; $BODY$ LANGUAGE plpgsql STABLE STRICT;
在RETURNS SETOF
函数RETURN QUERY
中,会在连续调用的结果集中添加结果。只有未经修饰的RETURN
语句才会将数据返回给调用者。实际上,从y
返回了所有来回回复func2()
的所有内容。
另请注意,您的功能不是VOLATILE
,而是STABLE
。后一种模式用于在表没有更改时为多个表扫描提供相同结果的函数。它的性能优于VOLATILE
。
我还创建了函数STRICT
:如果没有提供ID,尝试查找行没有意义。