PL / pgSQL:在另一个函数

时间:2015-06-25 08:34:42

标签: 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(IDs int[])的人。

1 个答案:

答案 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,尝试查找行没有意义。