从另一个查询调用时,返回 SETOF 记录会丢失记录类型

Posted

技术标签:

【中文标题】从另一个查询调用时,返回 SETOF 记录会丢失记录类型【英文标题】:Returning SETOF record loses record type when called from another query 【发布时间】:2020-03-02 21:39:36 【问题描述】:

我声明了一个 Postgres 函数,它从一个已经存在的表中返回一组记录。

create function foo_get(b bar)
returns setof foo as $$
  select foo.*
  from foo
  where foo.bar = b.id;
$$ language sql stable;

这是我编写的实际函数的简化,但按预期工作(它返回 foo 的所有列,用于我想要查找的所有记录)。

但是,如果我尝试以以下方式专门访问这些列,Postgres 会抱怨:

select wumbo.id from
(select foo(bar) from bar) as "wumbo";

这导致说 wumbo 没有 id 列,即使如果我只要求 select wumbo.* 而不是 select wumbo.idid 数据也会返回。

如果我在这里做一些违反范式的事情我很好(如果我这样做我并不感到惊讶),但我想了解原因。返回 setof foo 不等于返回我的 foo 表的完整架构吗? Postgres 是否将我返回的记录转换为没有列类型的匿名记录?

【问题讨论】:

【参考方案1】:

您正在从具有单个匿名列的表中进行选择,该列包含 foo 记录。 wumbo 表确实没有 id 列。以下将起作用:

select (wumbo.column).id
from (select foo(bar) as column from bar) as wumbo;

不过,我建议改用横向查询:

select wumbo.id
from bar, foo(bar) as "wumbo";

【讨论】:

以上是关于从另一个查询调用时,返回 SETOF 记录会丢失记录类型的主要内容,如果未能解决你的问题,请参考以下文章

查询返回语句 - PostgreSQL

脚本在手动运行时完全运行,但在从另一个脚本运行时会丢失命令

从另一个表中复制 IDENTITY 列并为丢失的记录生成新的 ID

多线程,共享HttpServeltRequest对象时候,对象丢失现象

在 WHILE LOOP 部分之后从 PostgreSQL 函数返回 SETOF 行

如何从另一个页面调用 useState?