期待多个ResultSet,但只获得一个

时间:2014-07-11 09:28:11

标签: java jdbc 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个选择。

为什么会这样?

1 个答案:

答案 0 :(得分:3)

您误解了getMoreResults返回的布尔值的含义:

  

如果满足以下条件,则没有更多结果:

// stmt is a Statement object
((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
     

<强>返回
     true如果下一个结果是ResultSet个对象; false 如果是更新次数,或者没有更多结果

由于您的存储过程中没有SET NOCOUNT ONSELECT ... 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()?