英文:
how to wrap a boolean oracle function on a java integer using mybatis?
问题
这是 pack_name.func_name
在 SQL Developer 中的工作:
使用 Spring 和 MyBatis,在处理 无法更新的旧 JDBC 驱动程序中的 Oracle 的 BOOLEAN 类型 时遇到问题。尝试 这个想法,我在我的 something-mapper.xml
中有以下内容:
<mapper namespace="java.packs.SomethingMapper">
<select id="approvePO" parameterType="Map" statementType="PREPARED" 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>
其中该方法被声明为 void approvePO(final Map<String, Object> map);
,但出现了以下错误:
### 在设置参数时发生错误
### SQL: begin ? := case when pack_name.func_name( ?, ?, ?, ? ) then 1 else 0 end; end;
### 原因: java.sql.SQLException: 缺少索引为 1 的 IN 或 OUT 参数
以下是输入映射的调试信息:
但我无法理解应该如何更改才能使其正常工作。
英文:
so this is pack_name.func_name working at sql developer:
using spring and mybatis, i have the issue to deal with oracle's BOOLEAN type with an old jdbc driver that i cannot update. trying this idea, i have at my something-mapper.xml
<mapper namespace="java.packs.SomethingMapper">
<select id="approvePO" parameterType="Map" statementType="PREPARED" 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>
where the method is declared as void approvePO(final Map<String, Object> map);
but got this error:
### The error occurred while setting parameters
### SQL: begin ? := case when pack_name.func_name( ?, ?, ?, ? ) then 1 else 0 end; end;
### Cause: java.sql.SQLException: Missing IN or OUT parameter at index:: 1
and here's the input map debbuged:
but i cannot understand what i should change to make this work
答案1
得分: 0
我能够使用这个映射器来运行我的布尔函数:
<select id="approvePO" parameterType="Map" statementType="CALLABLE" resultType="Integer">
{ call 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>
将 statementType 更改为 callable,resultType 更改为 integer,并以 { call begin
开始。
英文:
i was able to run my boolean function with this mapper:
<select id="approvePO" parameterType="Map" statementType="CALLABLE" resultType="Integer">
{ call 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>
changed statementType to callable, resultType to integer and started with { call begin
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论