【问题标题】:SELECT FROM a function returning a record with arbirary number of columnsSELECT FROM 函数返回具有任意列数的记录
【发布时间】:2012-02-28 03:49:26
【问题描述】:

我正在使用 PostgreSQL 数据库。

我有一个我的 plpgsql FUNCTION,它返回一个带有任意数量列的 record
由于这种任意性,我需要使用类似的东西:

SELECT * FROM my_function(97)

但这不起作用,因为 Postgres 给了我以下错误:

返回“记录”的函数需要列定义列表

但如果我这样做:

SELECT my_function(97)

我可以看到预期的结果,但封装在一个列中。

有没有办法将预期结果作为函数预期的一组列而不是封装所有列的单个列?

【问题讨论】:

    标签: postgresql stored-procedures types record plpgsql


    【解决方案1】:

    当一个函数只有RETURNS recordSETOF record(没有OUT 参数)时,PostgreSQL 不知道其元素的名称和类型,并且您需要为每个元素提供一个列定义列表打电话。

    尽可能避免,并返回一个众所周知的(行)类型。有几种方法可以声明返回类型。见:

    关于 SO 有很多相关的问题。 Try a search!

    【讨论】:

      【解决方案2】:

      在选择列表中使用集合返回函数 (setof) 时,在 FROM 的左侧,该函数返回 composite type。使用表格作为函数的输入时,很难避免在选择列表中使用函数。

      从复合类型的单个列中选择项目的方法如下:

      SELECT
        (my_function).field1,
        (my_function).field2,
        (my_function).field3
      FROM
      (SELECT my_function(*) 
       FROM sometable) t
      

      【讨论】:

        【解决方案3】:

        你有几个选择:

        1. 返回 REFCURSOR 并从应用程序中的该游标中获取。请注意,如果您需要返回多个结果集,实际上可以返回多个 REFCURSORS。

        2. 返回一个 XML 文档并在应用程序中对其进行解析。

        3. 使用一堆 OUT 变量,返回 RECORD,并确定从中选择哪些变量

        基本问题是实际返回结果需要在计划时知道,因此您不能只返回任意数量的列。计划者需要知道要返回什么。

        【讨论】:

          【解决方案4】:

          为了返回“一组列”,您需要将返回类型定义为TABLESETOF,在这种情况下,您实际上会返回一组记录,您应该能够从中获得SELECT

          有关返回 SETOF 的函数的更多信息,请查看 this link to documentation

          【讨论】:

          • 问题是该表无论如何都需要一组固定的列,所以无论如何这都不能解决问题,我的问题是如何从一个不能返回带有 ARBITRARY 的 RECORD 的函数中获取列数,假设一次返回 3 列的记录,另一次返回 2 列的记录。
          • @flash.tato 在这种情况下,如果你不知道你的输出可能是什么样子,你建议如何选择任何东西?
          • 我认为引擎应该检查RECORD并获取字段的元数据
          • @flash.tato 如果你这样定义它,它会,但除非它知道这样做,你为什么期望它呢?您已将您的函数定义为返回一个类型为 RECORD 的单个变量,这意味着它对引擎的看法正是它所看到的。
          • 问题是,它可能返回一个 6 列的记录,而另一次返回 8 列的记录,有没有办法选择所有这些列?
          【解决方案5】:

          我不确定我是否遵循您的要求,但这有效吗?

          SELECT (my_function(97)).my_column
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-13
            • 2020-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多