1

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

4

1 回答 1

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 函数参数

光标

为了完整性:可以返回 a CURSOR,这与您所要求的概念非常相似。手册中的详细信息在这里。
但我几乎从不使用游标。表函数在大多数情况下更实用。

于 2014-03-28T02:53:07.070 回答