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,则尝试查找行毫无意义。
我有一个函数 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()
.
另请注意,您的函数不是 VOLATILE
,而是 STABLE
。后一种模式用于在 table 不变的情况下对多次 table 扫描给出相同结果的函数。它的性能优于 VOLATILE
函数。
我还创建了函数 STRICT
:如果未提供 ID,则尝试查找行毫无意义。