如何使用 pgAdmin 4.2 获取从 PG/PLSQL 中的函数返回的整个表数据或多行。
Posted
技术标签:
【中文标题】如何使用 pgAdmin 4.2 获取从 PG/PLSQL 中的函数返回的整个表数据或多行。【英文标题】:How to get entire table data or multiple rows returned from a function in PG/PLSQL with pgAdmin 4.2.? 【发布时间】:2019-03-12 17:01:23 【问题描述】:我尝试使用 setof 和 table。 在 pgAdmin 4.2 中创建函数时,没有称为 setof 或 table 的返回类型。如果我使用 setof 和表名作为选定的返回类型创建函数,它只返回一行表。
CREATE FUNCTION pgsql_returnrecords() RETURNS SETOF RECORD(name char, city, char, id integer) AS
$BODY$
DECLARE
rec RECORD;
BEGIN
select name,city,id INTO rec from test;
return next rec;
END;
$BODY$ language plpgsql;
我希望我的函数返回包含所有行和列的表数据。
【问题讨论】:
【参考方案1】:它可以是returns setof record
或returns table(....)
或setof table_name
使用returns setof record
您必须在使用函数时指定列名。
您也没有返回完整的结果,因为您只获取一行,将其放入记录并返回。要返回真正的“集合”,您需要在 PL/pgSQL 中使用 return query
。但是这样的函数最好写成 SQL 函数:
CREATE FUNCTION pgsql_returnrecords()
RETURNS table(name text, city text, id integer)
AS
$BODY$
select name,city,id
from test;
$BODY$
language sql;
如果您想始终从表 test
返回完整的行,您可以使用 returns setof test
而不是 returns table(..)
来简化它
CREATE FUNCTION pgsql_returnrecords()
RETURNS setof test
AS
$BODY$
select *
from test;
$BODY$ language sql;
或者,如果你坚持使用 PL/pgSQL:
CREATE FUNCTION pgsql_returnrecords()
RETURNS table(name text, city text, id integer)
AS
$BODY$
BEGIN
return query
select name,city,id
from test;
END;
$BODY$
language plpgsql;
在这两种情况下,您都必须像 FROM 子句中的表一样使用函数:
select *
from pgsql_returnrecords() ;
【讨论】:
但是 pgAdmin4.2 不接受 table 或 setof test 作为返回类型。 @Gauri:我不知道你所说的“接受”是什么意思。我的回答中的SQL是有效的,直接运行就可以创建函数了 我从你的第二个代码中得到了结果。谢谢。在创建函数时,我需要在选项中将“返回集合”设置为 YES。以上是关于如何使用 pgAdmin 4.2 获取从 PG/PLSQL 中的函数返回的整个表数据或多行。的主要内容,如果未能解决你的问题,请参考以下文章