2

我在 ORACLE 中有一个需要很长时间并返回一个字符串的函数。

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

问题出在哪里?

4

1 回答 1

2

看看如何用 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;
}

自从您发布以来已经有一段时间了,所以您可能已经弄清楚了,但是我发现这是自己在寻找答案,所以我想我应该做出回应。

于 2013-01-30T20:38:23.857 回答