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

vq8itlhq  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(5)|浏览(231)

我使用PostgreSQL数据库。
我有一个我的plpgsql FUNCTION,它返回一个带有任意列数的record
由于这种任意性,我需要使用如下内容:

SELECT * FROM my_function(97)

但这不起作用,因为Postgres给了我以下错误:
返回“record”的函数需要列定义列表
但如果我做了:

SELECT my_function(97)

我可以看到预期的结果,但封装在单个列中。
有没有一种方法可以按照函数的意图将预期的结果作为一组列而不是封装所有列的单个列来获取?

w41d8nur

w41d8nur1#

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

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

  • PostgreSQL:错误:42601:返回“record”的函数需要列定义列表
  • 重构PL/pgSQL函数以返回各种SELECT查询的输出

在SO.Try a search!上有很多相关的问题

qzlgjiam

qzlgjiam2#

当在选择列表中使用集合返回函数(setof)时,在FROM的左手,该函数返回composite type。当使用表作为函数的输入时,在选择列表中使用函数是很难避免的。
从复合类型的单个列中选择项的方法如下:

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

或者更简单地说

SELECT (my_function('input thing')).field1
knsnq2tg

knsnq2tg3#

你有几个选择在这里:
1.返回一个REFCURSOR并在应用程序中从该游标中获取。注意,如果需要返回多个结果集,实际上可以返回多个REFCURSORS。
1.返回XML文档并在应用程序中解析它。
1.使用一组OUT变量,返回RECORD,并确定从中选择哪个
最基本的问题是,实际的返回结果需要在 * 规划 * 时知道,所以你不能只是返回任意数量的列,规划者需要知道将要返回什么。

cnwbcb6i

cnwbcb6i4#

为了返回一个“列集”,你必须定义一个返回类型为TABLESETOF,在这种情况下,你实际上返回了一组记录,你应该能够从中SELECT
有关返回SETOF的函数的更多信息,请查看this link to documentation

soat7uwm

soat7uwm5#

我不确定我是否明白你的意思,但这有用吗?

SELECT (my_function(97)).my_column

相关问题