我有一个函数 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( ID int[])
.
最佳答案
由于 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,则没有必要尝试查找行。
关于sql - PL/pgSQL : merge results from iterative function call in another function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31045147/