如果有几个存储过程(PG 中的函数)需要在它们之间传递一个中间结果集(最多 1K 行)
我可以在其他 DBMS 中执行此操作,但想知道如何在本机 PostgreSQL 中完成此操作。
PG具体支持:
CREATE TYPE MyTable AS TABLE(...)
我们也可以完全在内存中做到这一点吗?
我想在几个 procs 之间传递一个“MyTable”作为输入和输出。
或者我可以构建这个结果集并将其作为 JSONB 参数传递吗?
无论它是如何完成的,我都需要它非常快。
如果有几个存储过程(PG 中的函数)需要在它们之间传递一个中间结果集(最多 1K 行)
我可以在其他 DBMS 中执行此操作,但想知道如何在本机 PostgreSQL 中完成此操作。
PG具体支持:
CREATE TYPE MyTable AS TABLE(...)
我们也可以完全在内存中做到这一点吗?
我想在几个 procs 之间传递一个“MyTable”作为输入和输出。
或者我可以构建这个结果集并将其作为 JSONB 参数传递吗?
无论它是如何完成的,我都需要它非常快。
您可以传递表类型的数组:
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;
这个问题有点不清楚,但最好的方法可能是在函数之间传递一个游标。
这是一个玩具示例,请参阅文档以获取更多信息:
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)