我正在尝试使用 PL/pgSQL (PostgreSQL 9.3) 实现一个函数,该函数返回与参数中的输入表具有相同结构的表。基本上,我想更新一个表,并使用 plpgsql 返回更新后的表的副本。我搜索了 SO 并发现了几个相关的问题(例如,从 PL/pgSQL 函数返回具有未知列的动态表和表名称作为 PostgreSQL 函数参数),这导致了以下最小测试示例:
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;
但是我无法在
TABLE
中为 SETOF RECORD
或 problem line
提供正确的返回类型。根据这个答案:
SQL 要求在调用时知道返回类型
但我认为返回类型(我打算从输入表类型借用)是已知的。有人可以帮忙解释一下是否可以修复上述 PL/pgSQL 函数的签名吗?
注意,我需要参数化输入表并返回该表的更新。欢迎替代方案。
到目前为止你所拥有的看起来不错。缺少的成分:多态类型。
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);
参见(最后一段):