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

时间:2014-12-25 18:59:08

标签: postgresql polymorphism plpgsql dynamic-sql

我正在尝试使用PL / pgSQL(PostgreSQL 9.3)实现一个函数,该函数返回一个与参数中的输入表结构相同的表。基本上,我想更新一个表,并使用plpgsql返回更新表的副本。我在SO周围搜索并发现了几个相关的问题(例如Return dynamic table with unknown columns from PL/pgSQL functionTable 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 RECORDproblem line提供正确的返回类型。根据{{​​3}}:

  

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

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

注意,我需要对输入表进行参数化并返回该表的更新。欢迎替代方案。

1 个答案:

答案 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);

SQL Fiddle.

更多细节(最后一段):