2010-12-20 137 views
0

我有代碼存儲過程返回sysrefcursor作爲OUT參數。PLSQL存儲過程返回sysrefcursor

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"); 

上面的代碼返回結果集光標,如果我關閉這個遊標則拋出在java端有個例外,任何人都可以幫我決定是否關閉RESULTSET。

更新:

是否需要關閉java中或ibatis xml中的oracle遊標。

+0

有什麼例外?也可以使用函數返回類型sys_refcursor – 2010-12-20 06:53:24

回答

1

「有人幫我上是否關閉 中的結果還是不」

不要關閉它在存儲過程中。

參考光標是一個指針;關閉遊標變量釋放內存。因此,你的java代碼拋出一個異常。

您的所有存儲過程需要做的是打開參考光標並將其分配給OUT參數。讓你的java代碼處理閉包(在獲取所有數據之後,顯然)。


「我是否需要關閉Oracle遊標 在Java或ibatis的XML。」

我對Ibatis不熟悉,但是我從谷歌搜索的主題中看到的例子表明queryForObject()調用處理遊標。並不是說我發現任何實際的文檔都說明了這一點,我只是從沒有提到任何關閉的情況推斷出來的。

+0

謝謝,但我從Ibatis調用存儲過程,請再次看到問題,我用ibatis調用過程更新它。 – 2010-12-20 06:55:37