如何让PL/pgSQL函数返回record[]类型的记录数组
解决方案
你遇到的报错核心原因是 PL/pgSQL 不支持返回匿名的record[]类型,匿名record没有预定义的结构,PL/pgSQL的类型系统无法识别处理。你只需要提前定义明确的复合类型替代匿名record即可,同时修正原函数中缺少RETURN QUERY的语法问题。
步骤1:创建自定义复合类型
对应你要聚合的员工字段结构,创建明确的复合类型:
CREATE TYPE employee_agg AS ( id int, name text );
步骤2:修改PL/pgSQL函数
将返回值中的数组类型改为自定义的employee_agg[],同时在array_agg中显式将员工行转为该复合类型,并且加上RETURN QUERY将查询结果作为函数返回:
CREATE OR REPLACE FUNCTION _test() RETURNS table(id integer, name text, agg employee_agg[]) LANGUAGE plpgsql AS $BODY$ begin RETURN QUERY SELECT employer.id, employer.name, array_agg((employee.id, employee.name)::employee_agg) FROM employer LEFT JOIN employer_employee_join ON employer_employee_join.employer_id = employer.id LEFT JOIN employee ON employee.id = employer_employee_join.employee_id GROUP BY employer.id; end; $BODY$;
测试调用
直接执行即可得到预期结果:
SELECT * FROM _test();
内容的提问来源于stack exchange,提问作者mmm111mmm
相关产品推荐
相关产品推荐

