PL SQL存储过程返回引用游标

时间:2010-12-20 06:36:07

标签: oracle stored-procedures plsql ibatis

我有代码存储过程,它返回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游标。

1 个答案:

答案 0 :(得分:1)

  

“任何人都会帮助我关闭   结果与否“

请勿在存储过程中将其关闭。

Ref Cursor是一个指针;关闭游标变量会释放内存。因此,您的Java代码会抛出异常。

您需要执行的所有存储过程都是打开引用游标并将其分配给OUT参数。让你的java代码处理闭包(显然是在它获取了所有数据之后)。


  

“我需要关闭oracle游标吗?   在java或ibatis xml中。“

我对Ibatis并不熟悉,但我从谷歌搜索主题中看到的例子表明queryForObject()调用处理光标。并不是说我发现任何实际的文件都说明了这一点,我只是因为没有提到关闭而推断。