2010-09-17 4 views
2

Что делает oracleClose() и oracleCloseQuery() в sqlj.runtime.ExecutionContext.OracleContext.Результирующий набор JDBC из хранимой процедуры Oracle PL/SQL

Поскольку мы обновили драйвер JDBC баночку для ojdbc5.jar с oracleClose() в конце концов блока мы получаем ниже исключение при использовании resultset.next() и не с oracleCloseQuery(). Безопасно ли использовать oracleCloseQuery(). База данных - это Oracle 11g и WAS 6.1.X.X. Цените свой ответ. Вот сообщение об ошибке:

java.sql.SQLException: Закрыто Заявление: следующая на oracle.jdbc.driver.SQLStateMapping.newSQLException (SQLStateMapping.java:70) в oracle.jdbc.driver.DatabaseError .newSQLException (DatabaseError.java:131) на oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:197) на oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:261) в oracle.jdbc .driver.DatabaseError.throwSqlException (DatabaseError.java:269) at oracle.jdbc.driver.OracleResultSetImpl.next (OracleResultSetImpl.java:205) at com.westgroup.pubsvc.r ms.models.ResultSetSRC.getNextResult (ResultSetSRC.java:112)

ответ

6

Исключение говорит вам, что Statement, который вернулся этот ResultSet будет закрыт в то время как вы пытаетесь перебрать ResultSet. Это указывает на то, что вы используете за пределами блок try, где выполнен Statement, и что вы, вероятно, используете как возвращаемое значение метода. Это плохая практика.

Я предлагаю вам переписать код JDBC, так что ResultSet будет обработан в том же самом try блоке, Statement будет выполнен, или что методы возвращаю что-то вроде как List<Entity> вместо ResultSet.

Вот зарезка пример правильного JDBC идиомы:

public List<Entity> list() throws SQLException { 
    // Declare resources. 
    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 
    List<Entity> entities = new ArrayList<Entity>(); 

    try { 
     // Acquire resources. 
     connection = database.getConnection(); 
     statement = connection.createStatement("SELECT id, name, value FROM entity"); 
     resultSet = statement.executeQuery(); 

     // Gather data. 
     while (resultSet.next()) { 
      Entity entity = new Entity(); 
      entity.setId(resultSet.getLong("id")); 
      entity.setName(resultSet.getString("name")); 
      entity.setValue(resultSet.getInteger("value")); 
      entities.add(entity); 
     } 
    } finally { 
     // Close resources in reversed order. 
     if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} 
     if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
    } 

    // Return data. 
    return entities; 
} 

Кстати, вам не нужно Oracle JDBC драйвера конкретных классов/методов здесь. Это всего лишь java.sql.*. Таким образом, вы сохраняете JDBC-код переносимым среди баз данных.

+0

Спасибо за ваш ответ. Mothod возвращает Resultset и используется позже после выполнения блока finally, который не является хорошей практикой, но работал с версией драйвера JDBC Oracle - «10.2.0.1.0». И этот код представляет собой Java-код Jpublisher из хранимой процедуры. Это значит, что нам нужно изменить хранимую процедуру. – Lalitha

+1

Я не уверен, что делает JPublisher, но прохождение вокруг 'ResultSet' вне методов вроде плохой идеи. Вам не нужно изменять хранимую процедуру. Вам просто нужно сопоставить «ResultSet» с «списком », как показано в ответе. – BalusC

Смежные вопросы