MyBatis调用Oracle存储过程(含VARRAY输出参数)报错求助
排查MyBatis调用Oracle存储过程VARRAY输出参数报错的问题
1. 检查TypeHandler的注册与关联逻辑
- 确认MyBatis配置文件中已正确注册自定义TypeHandler:
<typeHandlers> <typeHandler handler="com.yourpackage.OutTextTypeHandler"/> </typeHandlers> - 验证Mapper XML/接口中是否为
ARR_TEXT_OUT参数指定了正确的TypeHandler,必须明确jdbcType=ARRAY并关联自定义处理器:
注解方式需在参数上添加<parameterMap id="Mdl101ParamMap" type="com.yourpackage.Mdl101Parameter"> <parameter property="arrTextOut" mode="OUT" jdbcType="ARRAY" javaType="com.yourpackage.OutText" typeHandler="com.yourpackage.OutTextTypeHandler"/> </parameterMap>@TypeHandler(OutTextTypeHandler.class)指定处理器。
2. 核对Oracle VARRAY类型名的准确性
自定义TypeHandler中创建数组对象时,必须使用数据库中带schema的完整VARRAY类型名,否则数据库无法识别参数类型,直接在设置阶段报错:
Array array = connection.createArrayOf("YOUR_SCHEMA.TEXT_VARRAY", outText.getItems());
3. 检查参数包装类的属性映射
- 确认
Mdl101Parameter中arrTextOut属性的getter/setter方法命名规范,MyBatis依赖这些方法绑定参数,名称不匹配会导致参数无法识别。 - 确保
arrTextOut的类型严格对应自定义OutText类,避免类型不匹配问题。
4. 排查JDBC驱动与版本兼容性
- 验证JDBC驱动版本与Oracle数据库版本是否匹配(如Oracle 11g对应ojdbc6,12c对应ojdbc7/8),版本不兼容会导致ARRAY类型处理底层报错。
- 检查JBoss容器中是否存在多版本JDBC驱动,类加载冲突会干扰驱动对ARRAY类型的处理逻辑。
5. 确认存储过程调用的语法正确性
Mapper XML中必须将statementType设为CALLABLE,否则MyBatis无法识别存储过程的OUT参数:
<select id="resolve" statementType="CALLABLE" parameterMap="Mdl101ParamMap"> {call YOUR_PROCEDURE(#{arrTextOut, mode=OUT, jdbcType=ARRAY, typeHandler=com.yourpackage.OutTextTypeHandler})} </select>
6. 验证自定义TypeHandler的方法实现
针对OUT参数,setParameter方法的逻辑是注册参数类型而非设置具体值,错误的逻辑会直接导致参数设置阶段报错:
@Override public void setParameter(PreparedStatement ps, int i, OutText parameter, JdbcType jdbcType) throws SQLException { // OUT参数只需注册类型,无需设置值 ps.registerOutParameter(i, Types.ARRAY, "YOUR_SCHEMA.TEXT_VARRAY"); }
内容的提问来源于stack exchange,提问作者Emmanuele Guerriero
相关产品推荐
相关产品推荐

