【问题标题】:Basic json_to_recordset Query Getting 'set-valued function called in context that cannot accept a set'基本 json_to_recordset 查询获取“在不能接受集合的上下文中调用的集合值函数”
【发布时间】:2018-11-08 02:35:59
【问题描述】:

我正在做一个基本的json_to_recordset 查询,据我所知,它遵循the docs 中的模式。但我收到一个我不明白的错误。 (我会在代码示例之后总结我的研究。)

select my_schema.my_func(2, 2366800)
=>    my_func
      json
      ----------------------------------------------------
      [{"col_a":"...", "col_b":"...", "col_c":"..."}, ...]

select *
from json_to_recordset(my_schema.my_func(2, 2366800))
as results (col_a         TEXT,
            col_b         TEXT,
            col_c         NUMERIC(10,2))
=> ERROR:  set-valued function called in context that cannot accept a set

除了文档之外,我还对json_to_recordset 的其他示例进行了查询。 (1, 2, 3) 据我所知,我的查询应该有效。

我已经查看了 set-valued function 错误。 (123;甚至是4,上面写着“当函数返回 SETOF 时,您需要将其视为表格。”)不幸的是,我没有找到任何解释为什么这个错误会发生在这个特定的查询中。

【问题讨论】:

  • 一切都表明函数定义不正确。如果它返回setof json,请将其更改为json。或者编辑问题并显示函数。
  • @klin 发现:函数的返回类型是setof json。我没有太多使用函数,所以我需要弄清楚如何适当地修改函数——或者如何将setof json 转换为json。 (函数以RETURN QUERY select array_to_json(...) ... 开头,所以我需要学习如何在没有QUERY 的情况下重写它。)谢谢!

标签: postgresql


【解决方案1】:

我的另一个答案是我的问题的直接答案,但我想单独列出解决方案,因为解决方案是针对这种情况的,而答案是一般性的。

最简单的解决方案是将my_func修改为返回json而不是setof json,但是这个函数在其他地方使用,所以我想在不修改my_func的情况下处理类型不匹配。

here 所述,“当函数返回 SETOF 某些内容时,您需要将其视为表格。”因此解决方案涉及将my_func 的输出视为一个表(单个值),并将该行传递给json_to_recordset 函数。 Postgres 的横向连接成功了:

select results.*
from my_spec.my_func(2, 2366800) json,
     lateral json_to_recordset(json)
          as results (col_a         TEXT,
                      col_b         TEXT,
                      col_c         NUMERIC(10,2));

【讨论】:

    【解决方案2】:

    正如@klin 在评论中指出的那样,问题在于my_func 正在返回setof jsonjson_to_recordset 采用json。这种类型不匹配是导致错误的原因。

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多