如何从Postgres的函数返回临时表?(how to return temp table from

2019-10-19 17:18发布

我有以下查询独立运行良好,但显示许多问题上的Postgres函数内

CREATE TEMP TABLE tbl (h ltree, pathid int) ; 
CREATE TEMP TABLE temp_res (pathid int, res_count int) ; 
insert into tbl select l_tree,pathid from tblinfo where parentid in (880);
insert into temp_res select T.pathid pathid from tblinfo p1, tbl T where index(p1.l_tree,T.h ) != -1 GROUP BY T.pathid order by T.pathid;
select p.pathid pathid, p.name name, p.PBS PBS,p.parentid parentid,p.resid resid from tblinfo p, temp_res t where t.pathid = p.pathid;

我只需要像函数

CREATE OR REPLACE FUNCTION getresourceinfo(opened_path int,tablename varchar) returns TABLE (pathid int,name varchar,pbs varchar, parentid varchar, resid int) AS $BODY$ 

只需要使用两个变量opened_pa​​th和表名对880分别tblinfo。 我知道有大约返回表的很多帖子,但我想他们中许多人我的基本知识的Postgres任何建议将是很大的帮助后问。 如果你觉得我的查询是笨拙的,请只是帮我配一个功能需要两个参数的数n和表名。 假设有10列,其中之一是序列号现在函数返回的所有行> n和不是所有,但2或3的tablename列。

Answer 1:

临时表

要回答的标题你的问题:
人们不能 “返回从Postgres的功能一个临时表”。 创建临时表 ,并在同一会话中相同的用户自动显示。 他们在会议上(或更早)结束时自动删除。

表函数

但是,设置返回函数(又名“表函数”)可用于就像一个表:

CREATE OR REPLACE FUNCTION getresourceinfo(tablename regclass, opened_path int)
  RETURNS TABLE (pathid int, name varchar, pbs varchar
               , parentid varchar, resid int) AS
$func$ 
BEGIN

RETURN QUERY EXECUTE format(
  'SELECT t.pathid, t.name, t.pbs, t.parentid, t.resid
   FROM  ' || tablename || ' t
   WHERE  t.opened_path = $1'
   )
USING opened_path;

END
$func$ LANGUAGE plpgsql;

只会使意义一堆,所有共享相同的数据类型的硬编码列名的表。
呼叫(就像从表中选择):

SELECT * FROM getresourceinfo(1, 'my_schema.my_tbl')

为什么数据类型regclass为表参数?
表名作为PostgreSQL的函数参数

光标

为了完整:一个可以返回一个CURSOR ,这将是一个非常相似的概念,你要求什么。 详情这里的说明书中无。
但我很少使用游标。 表的功能都是比较实用的大部分时间。



文章来源: how to return temp table from postgres function?