来自Oracle PL/SQL存储过程的JDBC结果集

Lal*_*tha 2 java oracle jdbc oracle11g

oracleClose()和oracleCloseQuery()在sqlj.runtime.ExecutionContext.OracleContext中做了什么.

由于我们升级JDBC驱动程序罐子ojdbc5.jaroracleClose()在finally块使用时,我们得到以下的异常resultset.next(),而不是用oracleCloseQuery().使用安全吗oracleCloseQuery()?数据库是Oracle 11g和WAS 6.1.XX感谢您的回复.这是错误消息:

java.sql.SQLException:Closed语句:下一个位于oracle.jdbc.driver上的oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131) .databaseError.throwSqlException(DatabaseError.java:197)位于oracle.jdbc的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:269). com.westgroup.pubsvc.rms.models.ResultSetSRC.getNextResult(ResultSetSRC.java:112)中的driver.OracleResultSetImpl.next(OracleResultSetImpl.java:205)

Bal*_*usC 6

例外情况是告诉您,当您尝试迭代时,已经关闭了Statement返回ResultSet的内容ResultSet.这表明,你正在使用ResultSet try其中块Statement的被执行,并且你可能使用ResultSet作为方法的返回值.这是一种不好的做法.

我建议你重写你的JDBC代码,以便ResultSet在执行时在同一个try块中处理Statement,或者方法返回类似于List<Entity>而不是a的方法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;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这里不需要Oracle JDBC驱动程序特定的类/方法.这一切都很公正java.sql.*.这样可以使JDBC代码在数据库之间保持可移植性.