0

如果有几个存储过程(PG 中的函数)需要在它们之间传递一个中间结果集(最多 1K 行)

我可以在其他 DBMS 中执行此操作,但想知道如何在本机 PostgreSQL 中完成此操作。

PG具体支持:

CREATE TYPE MyTable AS TABLE(...)

我们也可以完全在内存中做到这一点吗?

我想在几个 procs 之间传递一个“MyTable”作为输入和输出。

或者我可以构建这个结果集并将其作为 JSONB 参数传递吗?

无论它是如何完成的,我都需要它非常快。

4

2 回答 2

0

您可以传递表类型的数组:

create function function_one()
  returns void
$$
declare
  l_rows my_table[];
begin
  select array_agg(mt)
    into l_rows
  from my_table mt
  where ...;

  perform function_two(l_rows);
  perform function_three(l_rows);
end;
$$
language plpgsql;
于 2020-04-21T15:09:37.353 回答
0

这个问题有点不清楚,但最好的方法可能是在函数之间传递一个游标。

这是一个玩具示例,请参阅文档以获取更多信息:

CREATE FUNCTION a() RETURNS refcursor
   LANGUAGE plpgsql AS
$$DECLARE
   c refcursor := 'cursorname';
BEGIN
   OPEN c FOR SELECT 42 AS col1;
   RETURN c;
END;$$;

CREATE FUNCTION b() RETURNS SETOF integer
   LANGUAGE plpgsql AS
$$DECLARE
   c refcursor;
   r record;
BEGIN
   c := a();

   LOOP
      FETCH NEXT FROM c INTO r;
      EXIT WHEN NOT FOUND;
      RETURN NEXT r.col1;
   END LOOP;
END;$$;

该示例的工作原理如下:

SELECT * FROM b();

 b  
----
 42
(1 row)
于 2020-04-21T15:01:24.387 回答