如何在 PL/pgSQL 中按行类型返回表

Posted

技术标签:

【中文标题】如何在 PL/pgSQL 中按行类型返回表【英文标题】:How to return a table by rowtype in PL/pgSQL 【发布时间】:2014-12-25 18:59:07 【问题描述】:

我正在尝试使用 PL/pgSQL (PostgreSQL 9.3) 实现一个函数,该函数返回一个与参数中的输入表具有相同结构的表。基本上,我想更新一个表,并用 plpgsql 返回更新后的表的副本。我搜索了 SO,发现了几个相关的问题(例如 Return dynamic table with unknown columns from PL/pgSQL function 和 Table name as a PostgreSQL function parameter),这导致了以下最小测试示例:

CREATE OR REPLACE FUNCTION change_val(_lookup_tbl regclass)
RETURNS _lookup_tbl%rowtype AS --problem line
$func$
BEGIN
    RETURN QUERY EXECUTE format('UPDATE %s SET val = 2 RETURNING * ; ', _lookup_tbl);
END
$func$ LANGUAGE plpgsql;

但我无法在problem line 中为TABLESETOF RECORD 提供正确的返回类型。根据this answer:

SQL 要求在调用时知道返回类型

但我认为返回类型(我打算从输入表类型借用)是已知的。有人可以帮助解释是否可以修复上述 PL/pgSQL 函数的签名吗?

注意,我需要参数化输入表并返回该表的更新。欢迎使用替代品。

【问题讨论】:

【参考方案1】:

到目前为止,您所拥有的看起来不错。缺少的成分:polymorphic types

CREATE OR REPLACE FUNCTION change_val(_tbl_type anyelement)
  RETURNS SETOF anyelement  -- problem solved
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY EXECUTE format(
      'UPDATE %s SET val = 2 RETURNING *;'
     , pg_typeof(_tbl_type))
     );
END
$func$;

调用(重要):

SELECT * FROM change_val(NULL::some_tbl);

db小提琴here旧sqlfiddle

见(最后一段):

Refactor a PL/pgSQL function to return the output of various SELECT queries

【讨论】:

非常感谢! (特别是对于 sqlfiddle:)。 有什么方法可以调用像 SELECT * FROM change_val('some_tbl');???? @RamCh: 不行。返回类型必须在函数声明时声明。

以上是关于如何在 PL/pgSQL 中按行类型返回表的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框中按行应用时如何保留数据类型?

使用 PL/pgSQL 在 PostgreSQL 中将多个字段作为记录返回

PL/pgSQL 函数在 pgAdmin 之外无法正确运行

如何纠正 PL/pgSQL 中缺少引用的“一对多表”?

如何在 Pandas 数据框中按行值对日期时间列进行排序?

如何使用 pl/pgsql 将具有动态元素名称的 JSON 数据转换为行?