SELECT FROM函数返回具有任意列数的记录

时间:2012-02-06 17:04:07

标签: postgresql stored-procedures types record plpgsql

我正在使用PostgreSQL数据库。

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

SELECT * FROM my_function(97)

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

  

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

但如果我这样做:

SELECT my_function(97)

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

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

5 个答案:

答案 0 :(得分:6)

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

尽可能避免,而是返回众所周知的类型。除了workarounds @Chris provided之外,还有其他几种声明返回类型的方法。我最近写了全面的相关答案:

已经有很多关于SO的相关问题。我记得回答过他们中的一堆 Try a search!

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

你有几个选择:

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

  2. 返回XML文档并在应用程序中解析它。

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

  4. 基本问题是实际的返回结果需要在规划时知道,因此您不能只返回任意数量的列。规划师需要知道将要归还的内容。

答案 3 :(得分:0)

为了返回“一组列”,您将定义一个返回类型为TABLESETOF,在这种情况下,您实际上会返回一组记录,您应该能够SELECT 1}}来自。

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

答案 4 :(得分:-1)

我不确定我是否遵循你所追求的目标,但这有效吗?

SELECT (my_function(97)).my_column