我在ORACLE中有一个FUNCTION,它接受一个LONG并返回一个STRING。
FUNCTION "GEN_NEXT_COD_NRE" (AN_ID_MEDIC IN NUMBER)
RETURN VARCHAR2
正如我读到的那样,在iBatis 3中没有标签,因此没有设置IN或OUT地图。
所以在我的DAO中,我有类似的东西:
public String createNextNre(MedicContract contract);
我的地图是:
<select id="createNextNre" statementType="CALLABLE" resultType="string" parameterType="MedicContract">
{? = call GEN_NEXT_COD_NRE(#{idMedic})}
</select>
不幸的是,这种方式不起作用。这是错误:
SQLException: Missing IN or OUT parameter at index:: 2
问题出在哪里?
答案 0 :(得分:2)
看着how to call stored function with mybatis并乱搞,我只是做了类似的工作
<select id="getTestFunction"
statementType="CALLABLE"
resultType="String">
select TEST_PKG.test_function() from dual
</select>
这是有效的,因为Oracle函数可以在select语句中调用。或者,如果您将参数类设置为保存OUT参数,则调用语法将起作用:
<select id="getTestFunction2"
statementType="CALLABLE"
parameterType="com.somecom.test.model.TestBean">
{
#{value,mode=OUT,jdbcType=VARCHAR} = call SYS.UTL_RAW.CAST_TO_VARCHAR2(TEST_PKG.test_function())
}
</select>
TestBean.java为:
public class TestBean {
String value;
public String getValue() { return value;}
public void setValue(String value) { this.value = value;}
}
请注意,OUT参数是在参数类上设置的,而不是结果,所以你需要在DAO方法中做一些事情:
public TestBean getTestFunction2() {
TestBean param = new TestBean();
getSqlSession().selectOne("getTestFunction2",param);
return param;
}
你发布以来已经有一段时间了,所以你可能已经知道了,但我发现这样找自己的答案,所以我觉得应该回应。