SELECT FROM函数返回一个具有arbirary列数的记录

fla*_*ato 5 postgresql types stored-procedures record plpgsql

我正在使用PostgreSQL数据库.

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

SELECT * FROM my_function(97)
Run Code Online (Sandbox Code Playgroud)

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

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

但如果我这样做:

SELECT my_function(97)
Run Code Online (Sandbox Code Playgroud)

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

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

Erw*_*ter 6

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

如果可能的话,避免使用并返回一个众所周知的类型.除了@Chris提供解决方法之外,还有其他几种方法来声明返回类型.我最近写了全面的相关答案:

关于SO已经有很多相关的问题了.我记得回答过他们中的一堆.
尝试搜索!


Noe*_*rof 5

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

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

SELECT
  (my_function).field1,
  (my_function).field2,
  (my_function).field3
FROM
  (SELECT my_function(*) 
  FROM sometable) t
Run Code Online (Sandbox Code Playgroud)

或者更简单地喜欢

SELECT (my_function('input thing')).field1
Run Code Online (Sandbox Code Playgroud)


Kar*_*son 0

为了返回一组“列”,您将定义一个返回类型,TABLE或者 SETOF在这种情况下,您实际上返回一组您应该能够SELECT从中获得的记录。

有关函数返回的更多信息,SETOF请查看此文档链接

  • @flash.tato 在这种情况下,如果您不知道输出可能是什么样子,您建议如何选择任何内容? (2认同)