【问题标题】:Multiple Statements in one ResultSet / ResultSet.next() returning false一个 ResultSet / ResultSet.next() 中的多个语句返回 false
【发布时间】:2019-11-08 05:51:15
【问题描述】:

我正在使用两个不同的查询从两个表中选择数据。我正在使用一个连接和一个结果集。两个表都已填充,但第二个查询的 resultset.next() 返回 false,尽管它必须为 true。

我还尝试使用两个不同的 PreparedStatements 和 Connections,但这些都不适合我。

DataSource ds = null;
Connection c = null;
PreparedStatement ps = null;
String sql = "SELECT * FROM TABLE1"
String sql2 = "SELECT * FROM TABLE2"

ds = // My datasource
c = ds.getConnection();

ps = c.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();

while (resultSet.next()) {
    // do smth
    // works
}

ps.close();


ps = c.prepareStatement(sql2);
resultSet = ps.executeQuery();

while (resultSet.next()) {
    // do somth
    // does not work although TABLE2 is populated
}

ps.close();

所以程序应该跳转到第二个while循环,因为查询sql2中有数据返回。你有什么建议吗?谢谢!

【问题讨论】:

  • 你确定table2 确实有committed 数据吗?我推测您在另一个客户端的打开会话中创建并填充了两个表,没有任何明确的提交;并且 table1 仅出现是因为创建 table2 的 DDL 隐式提交。
  • 是的,100% 确定.. :( 表仅由我选择而不是创建。SQL-Developer 中的相同查询正在返回数据...
  • 显式关闭结果集是一种很好的做法,但不应导致这种影响;而且我无法使用您的代码进行复制。另一个 - 微不足道但令人惊讶的常见 - 要排除的错误是,您实际上并没有以相同的用户身份连接,甚至没有连接到与 SQL Developer 相同的数据库,因此正在查看来自不同表的数据,而不是您预期的数据。特别是如果您发现单独的语句和连接存在相同的问题。
  • 您的标题似乎与您的问题无关,因为您没有在一个结果集中使用多个语句。您正在重用variables 的事实并不意味着您正在重用对象。在任何情况下,您都需要提供minimal reproducible example

标签: java oracle jdbc resultset


【解决方案1】:

在关闭preparedstatement之前尝试关闭结果集。

此外,如果遇到异常,使用 try/catch 进行清理是非常好的做法。见Must JDBC Resultsets and Statements be closed separately although the Connection is closed afterwards?

【讨论】:

  • 虽然这是个好建议,但这不能解决这个问题(除非有问题的驱动程序有很多问题)。
  • 大概是这样,但我认为值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 2015-08-14
  • 2012-11-03
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多