使用go-ora调用带返回值的Oracle函数时出现EOF错误求助
解决go-ora调用Oracle存储函数出现EOF错误的问题
问题分析
- 混合使用标准库
sql.Out与go-ora专属的go_ora.Out,两者参数处理逻辑不兼容,引发通信异常 - 原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
相关产品推荐
相关产品推荐

