问题描述
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;