You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移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对类型匹配的要求更严格,直接暴露了这个数据库端的函数定义问题。

修复步骤

  1. 修正返回类型匹配

    • 检查函数内部RETURN QUERY对应的SQL语句,确认prod_period_id字段的实际存储类型:
      • 如果原字段是bigint,将函数返回表定义中的prod_period_id integer改为prod_period_id bigint;
      • 如果需要保持integer类型,在查询时显式转换字段:prod_period_id::integer(注意:若字段值超出integer范围会导致溢出错误,需提前确认数据范围)。
  2. 清理语法冗余
    函数返回表定义的最后一行comm_rank_name character varying,后面存在多余的逗号和空行,虽然不是直接报错原因,但可能引发潜在语法问题,建议删除多余逗号,修正为:

    comm_rank_name character varying
    

内容的提问来源于stack exchange,提问作者Agny Nureza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:45:28