gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:58:56 27 4
gpt4 key购买 nike

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

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

java.sql.SQLException: Closed Statement: 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) at com.westgroup.pubsvc.rms.models.ResultSetSRC.getNextResult(ResultSetSRC.java:112)

最佳答案

异常(exception)情况是告诉您 Statement返回了这个 ResultSet当您尝试迭代 ResultSet 时已关闭。这表明您正在使用 ResultSet try 之外 block 所在Statement已执行,并且您可能正在使用 ResultSet作为方法的返回值。这是一种不好的做法

我建议您重写 JDBC 代码,以便 ResultSet已以完全相同的方式处理 try block 为 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 代码在数据库之间的可移植性。

关于java - 来自 Oracle PL/SQL 存储过程的 JDBC 结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3736832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com