gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:31:13 25 4
gpt4 key购买 nike

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

最佳答案

临时表

回答标题中的问题:
一个不能“从 postgres 函数返回一个临时表”。 Temporary tables are created并自动对同一 session 中的同一用户可见。它们会在 session 结束时(或更早)自动删除。

表函数

但是集合返回函数(又名“表函数”)可以像表一样使用:

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.
但我几乎从不使用游标。大多数时候表函数更实用。

关于sql - 如何从 postgres 函数返回临时表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com