2010-12-20 20 views
0

私は、OUTパラメータとしてsysrefcursorを返すコードストアドプロシージャを持っています。sysrefcursorを返すPLSQLストアドプロシージャ

CREATE OR REPLACE PROCEDURE report (rvdate IN VARCHAR2,RESULTSET OUT NOCOPY sys_refcursor) 
AS 
.. 

... 

. 

OPEN RESULTSET FOR (SELECT A.* FROM TEMP_DATA) 
... 
.. 
CLOSE RESULTSET 
END; 
/

<parameterMap id="inputParam" class="map"> 
      <parameter property="date" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> 
     <parameter property="output" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR" resultMap="rec-map" mode="OUT"/> 
</parameterMap> 

<procedure id="readReport" parameterMap="inputParam" > 
     <![CDATA[{ call report(?,?) } ]]> 
</procedure> 

iBATISのXML構成から、このプロシージャをコールし、Javaで私はこの

 java.util.Map map = new java.util.HashMap(); 
     map.put("date", date); 
     System.out.println("date" + date); 
     xmlconfig.queryForObject("readReport", map); 
     return (List)map.get("output"); 

上記のコードをやっているがResultSetのカーソルを返す私はこのカーソルを閉じた場合、それはスローjava end.anybodyの例外はRESULTSETを閉じるかどうかを教えてくれます。

更新:

javaまたはibatis xmlでoracleカーソルを閉じる必要がありますか。

+0

例外はありますか?また、戻り値の型sys_refcursor –

答えて

1

ストアドプロシージャでそれを閉じないでください

「誰もが RESULTSETかどうかをクローズするかどうかで私を助けて」。

Ref Cursorはポインタです。カーソル変数を閉じるとメモリーが解放されます。したがって、あなたのJavaコードは例外を投げつけます。

すべてのストアドプロシージャは、参照カーソルを開いてOUTパラメータに割り当てる必要があります。 javaコードがクロージャを処理するようにします(明らかにすべてのデータをフェッチした後)。


"私はJavaでまたはiBATISのXML内のOracleカーソル を閉じる必要があります。"

私はiBatisのに慣れていないんだけど、私は、トピックをグーグルから見てきた例はqueryForObject()呼び出しは、カーソルを扱うことを示唆しています。実際の文書が見つかったわけではありませんが、私は閉鎖の言及がないことからちょうど推測しています。

+0

の関数を使用することもできますが、私はIbatisからストアドプロシージャを呼びます。親切にも質問を参照してください。プロシージャを呼び出すibatisで更新しました。 –

関連する問題