【问题标题】:PreparedStatement.execute() returns false even there is resultset in SQL server?即使 SQL 服务器中有结果集,PreparedStatement.execute() 也会返回 false?
【发布时间】:2019-01-02 12:48:18
【问题描述】:

我的 sql 查询由 5 个部分组成,这些部分相互高度连接。第一部分创建一个临时表,第二部分使用该临时表并创建另一个临时表,第三部分使用在第二部分中创建的临时表并再次创建另一个临时表。第 4 部分从第 3 个临时表中选择一些数据,第 5 部分选择第 3 个临时表的计数。

由于临时表只能在preparedStatement中使用(我的意思是由preparedStatement创建的临时表不能从另一个preparedStatement中使用,我在没问题之前尝试过)我需要在prepare语句中这样做.

所以前 3 部分创建临时表,因为在将参数设置为preparedStatement 之后,我运行preparedStatement.execute() 3 次(我也尝试了1....x 次),然后我运行preparedStatement.execute() 但是它返回 false ,这意味着没有结果集。这是为什么?

PreparedStatement preparedStatement = conn.prepareStatement("select * into #tmp from tablex where ...\n" +
                "    select * into #tmp2 from #tmp where ...\n" +
                "    select * into #tmp3 from #tmp2 where ...\n" +
                "    select * from #tmp3\n" +
                "    select count(*) from #tmp3");

在上面,我添加了一个简单的插图。在这里,我需要使用准备好的语句获取第 4 次和第 5 次查询的结果。我该怎么做?

【问题讨论】:

  • 请添加相关代码和查询。
  • @Arnaud 由于机密性,我不能这样做,但我正在添加一个简单的插图。
  • 请仔细阅读execute()的API文档,了解false的含义。您尚未考虑第一个查询产生的更新计数。
  • @JollyRoger 在尝试之前您是否禁用了自动提交?

标签: java sql-server jdbc temp-tables


【解决方案1】:

您正在执行的语句会产生以下结果:

  1. 更新计数
  2. 更新计数
  3. 更新计数
  4. 结果集
  5. 结果集

execute(String)返回的布尔值false的含义是:

true 如果第一个结果是ResultSet 对象; false 如果是 更新计数或没有结果

这意味着您需要使用getUpdateCount() 来获取(第一个)更新计数,并使用getMoreResults() 来获取下一个结果(同样,这会返回一个具有相同含义的布尔值)。只有当execute()getMoreResults() 返回false getUpdateCount() 返回-1 时,才没有更多结果。

您需要执行以下操作:

boolean nextResultSet = statement.execute(...);
int resultSetCount = 0;
while (true) {
  if (nextResultSet) {
    resultSetCount++;
    try (ResultSet rs = statement.getResultSet()) {
      // Do something with result set
    }
  } else {
    int updateCount = statement.getUpdateCount();
    if (updateCount == -1) {
      // no more results
      break;
    }
    // do something with update count
  }
  nextResultSet = statement.getMoreResults();
}

您可以通过添加SET NOCOUNT ON 作为您执行的第一条语句来跳过部分复杂性;那么你将不会得到更新计数,只需要处理两个结果集。

【讨论】:

  • @GordThompson 是的,我也在其他地方写了一个类似的答案,但它并不完全符合所问的问题:)
  • 所以它是 getMoreResults 而不是一遍又一遍地编写 execute() 语句。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多