使用MyBatis包装Oracle布尔型函数为Java整数时遇参数缺失问题
解决MyBatis调用Oracle存储函数时的参数缺失错误
问题原因
你遇到的Missing IN or OUT parameter at index:: 1错误,核心原因是statementType设置错误:当前使用的PREPARED类型仅适用于普通SQL语句,无法正确解析PL/SQL块中的IN/OUT参数方向,导致MyBatis无法识别第一个OUT参数oReturn,进而认为参数缺失。
另外,旧JDBC驱动不支持Oracle BOOLEAN类型的处理思路(用case转成整数)是正确的,无需调整。
解决方案
1. 修改Mapper的statementType为CALLABLE
将<select>标签的statementType从PREPARED改为CALLABLE,让MyBatis使用CallableStatement来处理PL/SQL块,正确识别参数方向:
<mapper namespace="java.packs.SomethingMapper"> <select id="approvePO" parameterType="Map" statementType="CALLABLE" resultType="Integer"> begin #{oReturn,jdbcType=INTEGER,mode=OUT} := case when pack_name.func_name( #{I_po_num,jdbcType=INTEGER,mode=IN}, #{I_pgm_id,jdbcType=INTEGER,mode=IN}, #{O_err_msg,jdbcType=VARCHAR,mode=OUT}, #{I_user,jdbcType=VARCHAR,mode=IN} ) then 1 else 0 end; end; </select> </mapper>
2. 确保传入的Map包含所有参数Key
调用Mapper方法时,Map中需要包含所有IN/OUT参数的Key,OUT参数可以先设为null占位,MyBatis执行后会自动填充结果:
Map<String, Object> paramMap = new HashMap<>(); // 填充IN参数 paramMap.put("I_po_num", 1001); paramMap.put("I_pgm_id", 2002); paramMap.put("I_user", "admin"); // 为OUT参数占位 paramMap.put("oReturn", null); paramMap.put("O_err_msg", null); somethingMapper.approvePO(paramMap); // 执行后获取OUT参数结果 Integer returnCode = (Integer) paramMap.get("oReturn"); String errorMsg = (String) paramMap.get("O_err_msg");
3. 验证参数名称一致性
确保Map中的参数Key与Mapper中使用的名称完全一致(注意大小写,Oracle参数名称默认不区分大小写,但MyBatis中严格匹配Key名称)。
补充说明
如果调整后仍有问题,可以检查:
- MyBatis版本是否支持
CALLABLE类型(主流版本均支持) - 旧JDBC驱动是否能正确处理PL/SQL块的整数返回值
- 存储函数的参数顺序与Mapper中的参数顺序是否完全匹配
内容的提问来源于stack exchange,提问作者gabriel119435
相关产品推荐
相关产品推荐

