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

时间:2010-09-17 15:44:14

标签: java oracle jdbc oracle11g

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

由于我们在finally块中使用ojdbc5.jar将jdbc驱动程序jar升级到oracleClose(),因此在使用resultset.next()而不是oracleCloseQuery()时会出现以下异常。使用oracleCloseQuery()是否安全。该数据库是Oracle 11g和WAS 6.1.X.X.感谢您的回复。 以下是错误消息:

  

java.sql.SQLException:Closed语句:next   at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)   at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)   at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:197)   at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)   at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:269)   at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:205)   在com.westgroup.pubsvc.rms.models.ResultSetSRC.getNextResult(ResultSetSRC.java:112)

1 个答案:

答案 0 :(得分:6)

该异常告诉您,当您尝试迭代Statement时,已返回此ResultSet的{​​{1}}已被关闭。这表示您正在使用ResultSet ResultSet块,其中try已被执行且您可能正在使用Statement作为方法的返回值。这是一种不良做法

我建议你重写你的JDBC代码,以便ResultSet在与执行ResultSet完全相同的try块中处理,或者方法返回像Statement而不是List<Entity>

这是正确的JDBC习语的启动示例:

ResultSet

顺便说一下,这里不需要Oracle 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代码在数据库之间保持可移植性。