如何从postgres函数返回临时表?

时间:2014-03-28 00:29:20

标签: sql postgresql plpgsql dynamic-sql table-functions

我有以下查询独立运行,但在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使用两个变量的open_path和tablename。我知道很多关于返回牌桌的帖子,但是我在尝试了很多关于我们基本的postgres知识的帖子后,任何建议都会有很大的帮助。如果你觉得我的查询很笨拙,请帮我一个带2个参数的函数n和tablename。假设有10列,其中一列是序列号,现在函数应该返回所有行> n而不是除了2或3列tablename之外的所有行。

1 个答案:

答案 0 :(得分:1)

临时表

在标题中回答你的问题:
一个不能"从postgres函数返回临时表"。 Temporary tables are created并在同一会话中自动向同一用户显示。它们会在会话结束时(或更早)自动删除。

表格功能

但是set-returns函数(a.k.a。" table function")可以像表一样使用:

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表参数?
Table name as a PostgreSQL function parameter

光标

为了完整性:可以返回CURSOR,这与你要求的概念非常相似。 Details in the manual here.
但我几乎没有使用游标。表函数在大多数情况下更实用。