iBatis 3,JAVA,ORACLE和函数

时间:2012-10-22 14:27:03

标签: java oracle ibatis

我在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

问题出在哪里?

1 个答案:

答案 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;
}

你发布以来已经有一段时间了,所以你可能已经知道了,但我发现这样找自己的答案,所以我觉得应该回应。