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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:22:31