PostgreSQL,函数通过调用另一个函数返回查询

问题描述

Postgresql 12.希望一个函数通过调用一个函数但不知道如何调用来返回查询

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 ,因此不会返回预期的结构。

您需要改为select ... from getFromA():这样,它将返回正确的数据结构。

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