2013-02-12 79 views
4

我調用一個通過JDBC返回多個結果集的Sybase存儲過程。 我需要的是一個名爲「結果」列中的特定結果集 這是我的代碼:通過JDBC調用Sybase存儲過程時產生空結果集

CallableStatement cs = conn.prepareCall(sqlCall); 
cs.registerOutParameter(1, Types.VARCHAR); 
cs.execute(); 
ResultSet rs=null; 
int count = 1; 
boolean flag = true; 
while (count < 20000 && flag == true) { 
    cs.getMoreResults(); 
    rs = cs.getResultSet(); 
    if (rs != null) { 
     ResultSetMetaData resultSetMetaData = rs.getMetaData(); 
     int columnsCount = resultSetMetaData.getColumnCount(); 
     if (resultSetMetaData.getColumnName(1).equals("Result")) { 
      // action code resultset found 
      flag = false; 
      // loop on the resultset and add the elements returned to an array list 
      while (rs.next()) { 
       int x = 1; 
       while (x <= columnsCount) { 
        result.add(rs.getString(x)); 
        x++; 
       } 
      } 
      result.add(0, cs.getString(1)); 
     } 
    } 
    count++; 
} 

這裏會發生什麼事是,cs.getMoreResults,直到它到達目標一個返回很多空結果集。我無法使用cs.getMoreResults作爲循環條件,因爲它對空結果集返回false。

我放了一個固定的數字來結束循環,條件是沒有返回想要的結果集以防止它進入無限循環。它運行良好,但我不認爲這是正確的。

我認爲在Sybase select @variable = value

從分配返回空結果集有沒有人遇到這樣?

回答

7

您誤解了getMoreResults()的返回值。您還忽略了execute()的返回值,這個方法返回一個boolean指示第一個結果的類型:

  • true:結果是ResultSet
  • false:結果是更新計數

如果結果是true,那麼您使用getResultSet()檢索ResultSet,否則getUpdateCount()檢索更新計數。如果更新計數是-1這意味着沒有更多結果。請注意,當前結果爲ResultSet時,更新計數也將爲-1。知道getResultSet()應該返回null,如果沒有更多結果或結果是更新計數(最後一個條件是爲什麼你會得到這麼多的null值),也是很好的做法。

現在,如果您想檢索更多結果,請致電getMoreResults()(或其兄弟接受參數int)。 boolean的返回值與​​具有相同的含義,所以false並不意味着沒有更多結果

只有沒有更多的結果,如果getMoreResults()返回false和getUpdateCount()回報-1(如也記錄在Javadoc)

本質上講,這意味着,如果你要正確地處理所有的結果,你需要做類似下面:

boolean result = stmt.execute(...); 
while(true) { 
    if (result) { 
     ResultSet rs = stmt.getResultSet(); 
     // Do something with resultset ... 
    } else { 
     int updateCount = stmt.getUpdateCount(); 
     if (updateCount == -1) { 
      // no more results 
      break; 
     } 
     // Do something with update count ... 
    } 
    result = stmt.getMoreResults(); 
} 

我的猜測是,你得到了很多的更新計數的,你得到的實際ResultSet之前。

我對Sybase並不十分熟悉,但是如果您沒有在存儲過程的開始部分明確地放置SET NOCOUNT ON;,表哥SQL Server具有'煩人'的功能來從存儲過程返回更新計數。

注意:這個問題的部分答案是基於我的回答Execute 「sp_msforeachdb」 in a Java application

+0

我遇到了與SQL Server這個同樣的問題,你的回答幫我解決這個問題。我無法弄清楚爲什麼具有某些數據的'stmt.execute()'會返回'false',即使我可以清楚地看到手動運行時返回的結果集中的數據。我仍然不確定我是否理解'updateCount()',因爲我不相信存儲過程實際上正在更新任何數據。 – Catfish 2014-04-15 17:41:04

+0

@Catfish你也可以嘗試在你的sp中添加'SET NOCOUNT ON'。 – 2014-04-16 08:23:37

+0

我無權修改存儲的過程。你的答案似乎適用於我的情況。謝謝。 – Catfish 2014-04-16 13:17:02

相關問題