如何使用 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 recordreturns 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 中的函数返回的整个表数据或多行。的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 pgAdmin 3 将数据从 CSV 导入 Postgres 表?

从 Windows 移除 pgadmin 4

从 pgAdmin4 导出的 csv 文件中保留索引列

在 pgAdmin 中创建 ER 图 [关闭]

如何停止 pgadmin 4 进程?

无法从 Windows 上的 pgadmin 连接到 greenplum postgresql