我正在尝试使用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;
但我无法过去在TABLE
中为SETOF RECORD
或problem line
提供正确的返回类型。根据{{3}}:
SQL要求在调用时知道返回类型
但我认为返回类型(我打算从输入表类型中借用)是已知的。有人可以帮助解释是否可以修复上述PL / pgSQL函数的签名?
注意,我需要对输入表进行参数化并返回该表的更新。欢迎替代方案。
答案 0 :(得分:5)
到目前为止你看到的很好看。缺少的成分:polymorphic types。
CREATE OR REPLACE FUNCTION change_val(_tbl_type anyelement)
RETURNS SETOF anyelement AS -- problem solved
$func$
BEGIN
RETURN QUERY EXECUTE format(
'UPDATE %s SET val = 2 RETURNING *;'
, pg_typeof(_tbl_type))
);
END
$func$ LANGUAGE plpgsql;
致电(重要):
SELECT * FROM change_val(NULL::some_tbl);
更多细节(最后一段):