2

ORACLEに、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

問題はどこだ?

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 に答える