MyBatis を使用して呼び出す必要があるストアド プロシージャがあります。とにかく、このストアドプロシージャを呼び出すことができました。プロシージャには複数の出力パラメータがあります。out パラメータの 1 つは Oracle カーソルです。Oracle Cursor を反復処理する必要がありますが、fetchSize 属性を使用して jdbc ドライバーを微調整せずにこれを行うと、行ごとに処理され、このソリューションは非常に遅くなります。プロシージャ コールの fethcSize 属性を設定できます。
<select id="getEvents" statementType="CALLABLE" parameterMap="eventInputMap" fetchSize="1000">
{call myProc(?, ?, ?, ?, ?)}
</select>
しかし、これはまったく役に立ちません。複数の out パラメータがあるため、これは機能しないと思います。そのため、プログラムは、このフェッチ サイズをどこに適用する必要があるか、どの out パラメータに適用するかわかりません。ResultSet(Oracleカーソル)にフェッチサイズを設定する方法はありますか? java.sql パッケージの CallableStatemen を使用する場合と同様に、ResultSet フェッチ サイズを設定できます。
以下は、プログラムからのマッピング ファイルとプロシージャ コールです。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="mypackage.EventDao">
<resultMap id="eventResult" type="Event">
<result property="id" column="event_id" />
<result property="name" column="event_name" />
</resultMap>
<parameterMap id="eventInputMap" type="map" >
<parameter property="pnNetworkId" jdbcType="NUMERIC" javaType="java.lang.Integer" mode="IN"/>
<parameter property="pvUserIdentityId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="result" resultMap="eventResult" jdbcType="CURSOR" javaType="java.sql.ResultSet" mode="OUT" />
<parameter property="success" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
<parameter property="message" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
</parameterMap>
<select id="getEvents" statementType="CALLABLE" parameterMap="eventInputMap" fetchSize="1000">
{call myProc(?, ?, ?, ?, ?)}
</select>
</mapper>
そしてプログラムから呼び出します:
SqlSession session = sqlSessionFactory.openSession();
Map<String, Object> eventInputMap = new HashMap<String, Object>();
try {
EventDao ed = session.getMapper(EventDao.class);
eventInputMap.put("pnNetworkId", networkId);
eventInputMap.put("pvUserIdentityId", identityId);
eventInputMap.put("success", 0);
eventInputMap.put("message", null);
ed.getEvents(eventInputMap);
session.selectList("EventDao.getEvents", eventInputMap);
} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();
}
前もって感謝します!