期待多个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 ONSELECT ... 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()?