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

使用go-ora调用带返回值的Oracle函数时出现EOF错误求助

解决go-ora调用Oracle存储函数出现EOF错误的问题

问题分析

  1. 混合使用标准库sql.Out与go-ora专属的go_ora.Out,两者参数处理逻辑不兼容,引发通信异常
  2. 原godror未映射函数返回值result,但go-ora对Oracle函数的返回值、输出参数处理要求严格匹配参数类型与传递方式

修正步骤

1. 统一输出参数类型

完全替换sql.Out为go_ora.Out,确保所有输出参数都使用驱动专属类型处理。

2. 调整函数调用逻辑

针对带返回值+多输出参数的Oracle函数,可选择两种适配go-ora的调用方式:


方式一:使用SELECT语句调用函数(推荐)

var newProdId, errMsg string
var result int

// 调整调用语句为SELECT形式,适配go-ora参数解析逻辑
callCambioCodmatSap := `SELECT stl.pa_sinergia_material.f_cambio_codmat_sap(:pin_pro_id, :pout_pro_id, :pout_msj) FROM DUAL`

// 组装参数:输入参数 + 两个输出参数
params := []interface{}{
    proId,
    go_ora.Out{Dest: &newProdId, Size: 40},
    go_ora.Out{Dest: &errMsg, Size: 200},
}

// 通过QueryRow获取函数返回值
err := r.db.QueryRow(callCambioCodmatSap, params...).Scan(&result)
if err != nil {
    return "", errors.Wrap(err, "error :(")
}

方式二:调整PL/SQL块的参数绑定

若坚持使用BEGIN...END块,需将函数返回值也作为go_ora.Out类型绑定:

var newProdId, errMsg string
var result int

callCambioCodmatSap := `BEGIN :result := stl.pa_sinergia_material.f_cambio_codmat_sap(:pin_pro_id, :pout_pro_id, :pout_msj); END;`

// 所有参数统一使用go_ora.Out类型
_, err := r.db.Exec(callCambioCodmatSap,
    go_ora.Out{Dest: &result},
    proId,
    go_ora.Out{Dest: &newProdId, Size: 40},
    go_ora.Out{Dest: &errMsg, Size: 200},
)
if err != nil {
    return "", errors.Wrap(err, "error :(")
}

关键注意事项

  • 确保输出参数的Size值足够容纳返回字符串长度,避免截断或异常
  • 禁止混合使用sql.Out与go_ora.Out,驱动专属类型能更好适配Oracle参数传递逻辑
  • 若仍出现EOF错误,检查数据库连接配置、存储函数参数类型与代码变量类型是否完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:12:35