从另一个查询调用时,返回 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.id
,id
数据也会返回。
如果我在这里做一些违反范式的事情我很好(如果我这样做我并不感到惊讶),但我想了解原因。返回 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 记录会丢失记录类型的主要内容,如果未能解决你的问题,请参考以下文章
从另一个表中复制 IDENTITY 列并为丢失的记录生成新的 ID
多线程,共享HttpServeltRequest对象时候,对象丢失现象