我有以下查询独立运行,但在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之外的所有行。
答案 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.
但我几乎没有使用游标。表函数在大多数情况下更实用。