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

我正在尝试使用 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;

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

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

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

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

【问题讨论】:

    标签: postgresql polymorphism plpgsql dynamic-sql


    【解决方案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

    见(最后一段):

    【讨论】:

    • 非常感谢! (特别是对于 sqlfiddle:)。
    • 有什么方法可以调用像 SELECT * FROM change_val('some_tbl');????
    • @RamCh: 不行。返回类型必须在函数声明时声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多