Java调用含IN OUT类型SYS_REFCURSOR的Oracle存储过程报无效列索引错误如何解决
错误诱因
- 存储过程名称调用错误:实际定义的存储过程名为
TRADSS_DEVOLUCION,代码中调用时写为TRADSS_EVOLUTION,名称不匹配会导致参数绑定逻辑错位。 - 输入参数类型不匹配:存储过程第一个参数
pi_id_transaccion定义为number数值类型,代码中使用setString方法传入字符串类型值,参数类型不匹配触发索引校验错误。 - 未执行存储过程就直接读取输出参数:代码在注册完输出参数后没有调用
execute()方法触发存储过程执行,直接读取输出参数的索引位置此时是无效的。
修复方案
- 修正调用的存储过程名称,将调用语句改为:
connection.prepareCall("call OPERATOR.PKG_TRANSLATE.TRADSS_DEVOLUCION(?,?)")
- 替换第一个参数的赋值方法,匹配数值类型:
// 按idTrx实际类型选择setInt/setLong即可 callableStatement.setLong(1, idTrx);
- 在读取输出游标前增加执行逻辑:
callableStatement.registerOutParameter(2, OracleTypes.CURSOR); // 新增这行执行存储过程 callableStatement.execute(); ResultSet rst = (ResultSet) callableStatement.getObject(2);
如果使用高版本ojdbc驱动,也可以用标准JDBC的Types.REF_CURSOR代替Oracle专属的OracleTypes.CURSOR,兼容性更好。
内容的提问来源于stack exchange,提问作者Jhon Anaya Valiente
相关产品推荐
相关产品推荐

