如何从postgres函数返回临时表



我有下面的查询运行良好独立,但显示许多问题在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$ 

只需要分别为880和tblinfo使用两个变量opened_path和tablename。我知道有很多关于返回表的帖子,但我在尝试了许多关于我基本postgres知识的帖子后问,任何建议都会有很大的帮助。如果你觉得我的查询是笨拙的,请帮助我一个函数,需要2个参数一个数字n和表名。假设有10列,其中一列是序列号,现在函数应该返回所有行>n,而不是全部,但2或3列的表名

临时表

回答标题中的问题:
不能从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,这与您所要求的概念非常相似。详细信息请参阅手册。
但我几乎不用光标。表函数在大多数情况下更实用。

最新更新