我有一个存储过程,它返回多个结果集,如下所示,
create proc test as
begin
select '1'
select a,b into #temp from TABLE1
select * from #temp
select '2'
select 'Done'
end
我的java调用是,
CallableStatement stmt = null;
String procString= "EXEC test";
stmt = conn.prepareCall(procString);
boolean results = stmt.execute();
System.out.println(results);
do {
if(results) {
rs = stmt.getResultSet();
while (rs.next()) {
System.out.println(rs.getString(1) + ", " );
}
rs.close();
}
System.out.println();
results = stmt.getMoreResults();
System.out.println("results - "+results);
} while(results);
因此,根据上面的代码段,输出应该包含所有4个选择。但我只是得到第一个选择而没有别的。我刚删除了插入临时表的第二个选择,之后我得到了所有4个选择。
为什么会这样?
答案 0 :(得分:3)
您误解了getMoreResults
返回的布尔值的含义:
如果满足以下条件,则没有更多结果:
// stmt is a Statement object ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
<强>返回强>:
true
如果下一个结果是ResultSet
个对象;false
如果是更新次数,或者没有更多结果
由于您的存储过程中没有SET NOCOUNT ON
,SELECT ... INTO ...
将生成更新计数。这将在第一次选择后返回。只有当getMoreResults
返回false
并 getUpdateCount
返回-1
时才能确定没有更多结果。
do .. while
返回false后,您当前的代码将退出getMoreResults
。您需要将SET NOCOUNT ON
添加到存储过程,或者考虑更新计数来处理多个结果。
要使用更新计数正确处理多个结果,您需要执行以下操作:
PreparedStatement pstmt = connection.prepareStatement(...);
// ...
boolean result = pstmt.execute();
while(true)
if (result) {
ResultSet rs = pstmt.getResultSet();
// Do something with resultset ...
} else {
int updateCount = pstmt.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// Do something with update count ...
}
result = pstmt.getMoreResults();
}
我将上面的答案复制到了另一个问题的答案中,它是相似但不完全相同的。该答案的其余部分可能会提供更多详细信息:Java SQL: Statement.hasResultSet()?