PL/pgSQL: 合并另一个函数中迭代函数调用的结果

PL/pgSQL: merge results from iterative function call in another function

我有一个函数 func1(ID int) 可以为给定 ID return 行。

我有另一个函数 func2(IDs int[]),它获取 ID 数组并使用循环为每个 ID 调用 func1,最后它应该合并所有结果并 return 它。

两个函数 return 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 
  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 和 return?

简而言之,它应该做到:func1(1st ID) UNION func1(2nd ID) UNION ... UNION func1(nth ID) 和 return 它给曾经打电话给 func2(IDs int[]) 的人。

由于 func1() return 是一个集合,您可以将其用作简单查询中的 table 源。在 func2() 中,return 是一组相同的行类型,您可以遍历数组值并调用 func1() 并将 returned 集添加到结果集中当前函数:

CREATE OR REPLACE FUNCTION func2(IDs integer[]) RETURNS SETOF y AS $BODY$
DECLARE
  a_id int;
BEGIN
  FOREACH a_id IN ARRAY 
  LOOP
    RETURN QUERY SELECT * FROM func1(a_id); 
  END LOOP;
  RETURN;
END; $BODY$ LANGUAGE plpgsql STABLE STRICT;

RETURNS SETOF 函数中,RETURN QUERY 将在连续调用时将结果添加到结果集中。只有朴素的 RETURN 语句才会将数据 return 传递给调用者。实际上,来自所有调用的所有 returned y 都是来自 func2().

的 returned

另请注意,您的函数不是 VOLATILE,而是 STABLE。后一种模式用于在 table 不变的情况下对多次 table 扫描给出相同结果的函数。它的性能优于 VOLATILE 函数。

我还创建了函数 STRICT:如果未提供 ID,则尝试查找行毫无意义。