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

标签 sql postgresql plpgsql

我有一个函数 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/

相关文章:

c# - 需要在 Linq 中执行子查询

php - 使用 PHP 连接到列式数据库

python - Django-cities 退出时显示 "killed"

PostgreSQL CREATE INDEX CONCURRENTLY 等待列

sql - 在postgresql中灵活游泳

database - 使用触发器更新基于另一个表插入的表行?

postgresql - 在 plpgsql 触发器函数中用 "array_to_string"填充变量

php - 使用 PHP 动态表列

python - 在 Django 中查询与午夜重叠的多个营业时间范围

database - 从 PostgreSQL 函数生成 HTML