期待多个ResultSet,但只获得一个
我有一个存储过程,它返回多个结果集,如下所示,
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个选择。
为什么会这样?
您误解了getMoreResults
返回的布尔值的含义:
满足以下条件时,没有更多结果:
// stmt is a Statement object ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
退货 :
如果下一个结果是ResultSet
对象,则为true
否则为true
。 如果是更新计数或没有更多结果,则返回false
由于您的存储过程中没有SET NOCOUNT ON
, SELECT ... INTO ...
将生成更新计数。 这将在第一次选择后返回。 只有当getMoreResults
返回false
并且 getUpdateCount
返回-1
时,才能确定没有更多结果。
当getMoreResults
返回false do .. while
,您当前的代码将退出do .. while
您需要将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()?