我正在使用PostgreSQL数据库。
我有一个plpgsql FUNCTION
,它返回一个record
个列,其中包含任意数量的列。
由于这种随意性,我需要使用类似的东西:
SELECT * FROM my_function(97)
但是这不起作用,因为Postgres给了我以下错误:
返回“记录”的函数需要列定义列表
但如果我这样做:
SELECT my_function(97)
我可以看到预期的结果,但是封装在一个列中。
有没有办法将预期结果作为函数预期的一组列获取,而不是一个封装所有列的列?
答案 0 :(得分:6)
当函数只有RETURNS record
或SETOF 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)
你有几个选择:
返回一个REFCURSOR并从该应用程序中的游标中获取。请注意,如果需要返回多个结果集,则实际上可以返回多个REFCURSORS。
返回XML文档并在应用程序中解析它。
使用一堆OUT变量,返回RECORD,并确定从中选择哪一个
基本问题是实际的返回结果需要在规划时知道,因此您不能只返回任意数量的列。规划师需要知道将要归还的内容。
答案 3 :(得分:0)
为了返回“一组列”,您将定义一个返回类型为TABLE
或SETOF
,在这种情况下,您实际上会返回一组记录,您应该能够SELECT
1}}来自。
有关返回SETOF
的函数的详细信息,请查看this link to documentation
答案 4 :(得分:-1)
我不确定我是否遵循你所追求的目标,但这有效吗?
SELECT (my_function(97)).my_column