迁移GORM v2后PL/pgSQL函数报错:查询结构与返回类型不匹配
PL/pgSQL表函数迁移至GORM v2后出现返回类型不匹配错误
我创建了如下PL/pgSQL表函数:
CREATE OR REPLACE FUNCTION public.sp_production_snapshot(periodid integer, flagdc integer) RETURNS TABLE( prod_period_id integer, period character varying, nosp character varying, policy_no character varying, policy_name character varying, status_id integer, pol_status character varying, family_bisnis character varying, tahun_ke integer, year_comm integer, payment integer, plan_code character varying, life_premium double precision, rider_premium double precision, extra_premium double precision, total_premium double precision, mop integer, ccy_code character varying, ccy_rate double precision, post_date date, commence_date date, issue_date date, stream_start_date date, due_date date, app_code character varying, policy_cat character varying, apcrd_a_amt double precision, apcrd_b_amt double precision, apcrd_d_amt double precision, fyip_credit_amt double precision, comm_npk_id integer, comm_npk integer, comm_npk_name character varying, comm_rank_id integer, comm_rank_code integer, comm_rank_name character varying, ) LANGUAGE plpgsql AS $function$ BEGIN RETURN QUERY . . . . . . . . . ;
执行语句:
select * from sp_production_snapshot(865, 1);
触发错误:
SQL Error [42804]: ERROR: structure of query does not match function result type Detail: Returned type bigint does not match expected type integer in column 1. Where: PL/pgSQL function sp_production_snapshot(integer,integer) line 3 at RETURN QUERY
该函数在GORM v1环境下运行正常,但迁移至GORM v2后出现上述报错,请问脚本存在什么问题?
问题原因及解决方案
核心问题
错误提示明确指出:函数返回结果的第一列prod_period_id实际类型为bigint,但函数声明的返回类型是integer,两者类型不匹配。
GORM v1可能对数据库返回的类型做了隐式转换,或者之前的调用场景未触发严格的类型校验;而GORM v2对类型匹配的要求更严格,直接暴露了这个数据库端的函数定义问题。
修复步骤
修正返回类型匹配
- 检查函数内部
RETURN QUERY对应的SQL语句,确认prod_period_id字段的实际存储类型:- 如果原字段是
bigint,将函数返回表定义中的prod_period_id integer改为prod_period_id bigint; - 如果需要保持
integer类型,在查询时显式转换字段:prod_period_id::integer(注意:若字段值超出integer范围会导致溢出错误,需提前确认数据范围)。
- 如果原字段是
- 检查函数内部
清理语法冗余
函数返回表定义的最后一行comm_rank_name character varying,后面存在多余的逗号和空行,虽然不是直接报错原因,但可能引发潜在语法问题,建议删除多余逗号,修正为:comm_rank_name character varying
内容的提问来源于stack exchange,提问作者Agny Nureza
相关产品推荐
相关产品推荐

