如何在 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
中为TABLE
或SETOF 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 中按行类型返回表的主要内容,如果未能解决你的问题,请参考以下文章