我有代码存储过程,它返回sysrefcursor作为OUT参数。
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;
/
从ibatis xml配置调用此过程
<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>
在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抛出一个异常。有人帮我判断是否关闭了RESULTSET ..
更新:
我是否需要在java或ibatis xml中关闭oracle游标。
答案 0 :(得分:1)
“任何人都会帮助我关闭 结果与否“
请勿在存储过程中将其关闭。
Ref Cursor是一个指针;关闭游标变量会释放内存。因此,您的Java代码会抛出异常。
您需要执行的所有存储过程都是打开引用游标并将其分配给OUT参数。让你的java代码处理闭包(显然是在它获取了所有数据之后)。
“我需要关闭oracle游标吗? 在java或ibatis xml中。“
我对Ibatis并不熟悉,但我从谷歌搜索主题中看到的例子表明queryForObject()
调用处理光标。并不是说我发现任何实际的文件都说明了这一点,我只是因为没有提到关闭而推断。