Хранимая процедура PLSQL, возвращающая sysrefcursor

У меня есть хранимая процедура кода, которая возвращает 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. Кто-нибудь поможет мне, закрыть ли RESULTSET или нет.

Обновлять :

Мне нужно закрыть курсор оракула в java или в ibatis xml.


person Dead Programmer    schedule 20.12.2010    source источник
comment
Какое исключение? Также вы можете использовать функцию с возвращаемым типом sys_refcursor.   -  person Sayan Malakshinov    schedule 20.12.2010


Ответы (1)


"кто-нибудь поможет мне закрыть RESULTSET или нет"

Не закрывайте его в хранимой процедуре.

Ref Cursor — это указатель; закрытие переменной курсора освобождает память. Следовательно, ваш код Java вызывает исключение.

Все, что нужно сделать вашей хранимой процедуре, — это открыть курсор ссылки и присвоить его параметру OUT. Пусть ваш Java-код обрабатывает закрытие (очевидно, после того, как он извлечет все данные).


«Мне нужно закрыть курсор оракула в java или в ibatis xml».

Я не знаком с Ibatis, но примеры, которые я видел в Google по этой теме, предполагают, что вызов queryForObject() обрабатывает курсор. Не то чтобы я нашел какую-либо фактическую документацию, утверждающую, что это так, я просто делаю вывод об отсутствии каких-либо упоминаний о закрытии.

person APC    schedule 20.12.2010
comment
спасибо, но я вызываю хранимую процедуру из Ibatis, пожалуйста, посмотрите вопрос еще раз, я обновил его вызовом процедуры ibatis. - person Dead Programmer; 20.12.2010