我有下面的查询运行良好独立,但显示许多问题在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
,这与您所要求的概念非常相似。详细信息请参阅手册。
但我几乎不用光标。表函数在大多数情况下更实用。