Postgresql, function returns 通过调用另一个函数查询

Postgresql, function returns query by calling another function

Postgresql 12. 想要一个函数return通过调用另一个函数来查询但是不知道怎么调用。

create or replace function getFromA()
returns table(_id bigint, _name varchar) as $$
begin
    RETURN QUERY SELECT id, name from groups;
end; $$ language plpgsql;

create or replace function getFromB()
returns table(_id bigint, _name varchar) as $$
begin
    return query select getFromA();
end; $$ language plpgsql;

select getFromB();

出现错误:

SQL Error [42804]: ERROR: structure of query does not match function result type
Detail: Returned type record does not match expected type bigint in column 1.
Where: PL/pgSQL function getfromb() line 3 at RETURN QUERY

如何解决这个问题?

问题在getFromB():

return query select getFromA();

与其他一些数据库不同,Postgres 允许直接在 select 子句中使用 set-returning 函数。这可行,但可能很棘手:这个 returns 一个 set,因此不是预期的结构。

您需要 select ... from getFromA() 代替:这样它 returns 正确的数据结构。

create or replace function getFromB()
returns table(_id bigint, _name varchar) as $$
begin
    return query select * from getFromA();
end; $$ language plpgsql;

Demo on DB Fiddle