我的sql查询由5个相互紧密联系的部分组成。第一部分创建一个临时表,第二部分使用该临时表并创建另一个临时表,第三部分使用在第二部分中创建的临时表,然后再次创建另一个临时表。第四部分从第三临时表中选择一些数据,第五部分从第三临时表中选择计数。
由于临时表仅在preparedStatement中可用(我的意思是,由preparedStatement创建的临时表无法在另一个preparedStatement中使用,因此我尝试过之前还没做好),我需要在prepare语句中进行操作
因此,前3个部分创建了临时表,因为在将参数设置为prepareStatement之后,我运行了preparedStatement.execute()
3次(我也尝试了1 .... x次),然后运行了prepareStatement.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个查询的结果。我该怎么办?
答案 0 :(得分:1)
您正在执行的语句产生以下结果:
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
作为执行的第一条语句来跳过这种复杂性的一部分;那么您将不会获得更新计数,只需要处理两个结果集即可。