PostgreSQL函数如何返回声明变量存储的多值或多表查询结果?
PostgreSQL 返回多值/多表查询结果的实现方案
方案1:保留变量逻辑的优化实现
你原写法中使用RETURNS setof record的最大问题是调用时必须显式指定返回列结构,易用性很差,推荐用RETURNS TABLE直接预定义返回结构,不需要额外声明变量:
CREATE OR REPLACE FUNCTION public.select_multiple_values(id_ bigint) RETURNS TABLE ( id_child bigint, id_parent bigint, name_ varchar ) LANGUAGE plpgsql AS $function$ begin select id from public.req where id = id_ INTO id_child; select reg_id from public.req where id = id_ INTO id_parent; select "name" from public.reg where id = id_parent INTO name_; -- 直接返回当前行即可,不需要再写SELECT查询变量 RETURN NEXT; END; $function$;
调用方式非常简单,直接执行即可得到结构化结果:SELECT * FROM public.select_multiple_values(你的参数ID);
方案2:无变量的多表联查实现
如果不需要对中间变量做额外逻辑处理,直接用SQL函数做表关联查询即可,性能比PL/pgSQL函数更高,逻辑更简洁:
CREATE OR REPLACE FUNCTION public.select_multiple_values(id_ bigint) RETURNS TABLE ( id_child bigint, id_parent bigint, name_ varchar ) LANGUAGE sql AS $function$ SELECT r.id AS id_child, r.reg_id AS id_parent, rg.name AS name_ FROM public.req r LEFT JOIN public.reg rg ON rg.id = r.reg_id WHERE r.id = id_; $function$;
如果需要返回3张表的关联结果,只需要补充对应表的JOIN关联逻辑即可,示例:
SELECT r.id AS id_child, r.reg_id AS id_parent, rg.name AS name_, t3.xxx -- 第三张表的返回字段 FROM public.req r LEFT JOIN public.reg rg ON rg.id = r.reg_id -- 新增第三张表关联 LEFT JOIN 第三张表名 t3 ON t3.关联字段 = r.关联字段 WHERE r.id = id_;
如果你坚持使用原写法的
RETURNS setof record,调用时需要显式指定列结构,语法为:SELECT * FROM public.select_multiple_values(参数ID) AS t(id_child bigint, id_parent bigint, name_ varchar);,该方式过于繁琐,不推荐使用。
内容的提问来源于stack exchange,提问作者FeoJun
相关产品推荐
相关产品推荐

