Набор результатов JDBC из хранимой процедуры Oracle PL / SQL - PullRequest
2 голосов
/ 17 сентября 2010

Что делают oracleClose () и oracleCloseQuery () в sqlj.runtime.ExecutionContext.OracleContext.

Поскольку мы обновили jar драйвера jdbc до ojdbc5.jar с помощью oracleClose() в блоке finally, мы получаем следующее исключение при использовании 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) в oracle.jdbc.driver.OracleResultSetImpl.next (OracleResultSetImpl.java:205) в com.westgroup.pubsvc.rms.models.ResultSetSRC.getNextResult (ResultSetSRC.java:112)

1 Ответ

6 голосов
/ 17 сентября 2010

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

Я бы предложил вам переписать код 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...