2014-01-14 48 views
1

之後使用CallableStatement檢索ResultSet我需要多次調用存儲過程,並使用executeBatch()來實現此目的。每次調用都應該返回表格的結果,但我無法訪問此結果。接下來的代碼工作正常:如預期executeBatch()

callableStatement.setString(1, "foo"); 
callableStatement.setString(2, "bar"); 
callableStatement.execute(); 
resultSet = callableStatement.getResultSet(); 

但接下來的代碼不起作用:

for (String str : strings) { 
    callableStatement.setString(1, str); 
    callableStatement.setString(2, "bar"); 
    callableStatement.addBatch(); 
} 
callableStatement.executeBatch(); 
resultSet = callableStatement.getResultSet(); // returns null 

我已經嘗試過提取的ResultSet,但沒有成功之前調用callableStatement.getUpdateCount()callableStatement.getMoreResults()

+0

你的var應該是'callableStatement'還是'cs'?我認爲你的實際代碼不是這樣嗎?如果是這樣,那就是你的問題! – wmorrison365

+0

@ wmorrison365,當然,這是一個錯字。這不是實際的代碼,但足以找出我使用的兩種方法之間的差異。 – bsiamionau

回答

4

這不是#executeBatch的正確使用。批處理方法用於進行數據處理,而不是獲取結果數據。也就是說,您可以執行批量插入/更新/刪除操作,但不能讀取。 #executeBatch的結果是更新計數,指示每個批處理操作進行了多少更改

意圖是,您可以通過減輕網絡開銷和數據庫往返執行類似的數據操作操作來提高性能。

您通常不會在批處理中執行查詢,因爲不同的查詢會導致不同的形狀ResultSet(除非它們全部用於具有相同列但不同查詢的同一表[但爲什麼不只是修改查詢] )。

+0

謝謝你的回答。你在這種情況下看到了哪些解決方法?每次分開電話並閱讀結果? – bsiamionau

+0

@zvdh這不是一種解決方法,它是唯一真正的解決方案。 –

+0

是的,使用單獨的調用並在每個...之後讀取結果,或者如果查詢全部位於同一個表/列中,是否可以修改where子句以將更多結果合併到結果中(在您的proc中)或者參數化您的proc採取一個數組或關聯數組來允許它獲取多個可能的值?考慮一下,如果我們談論的是大型結果集,或者您的索引需要修改,這是否會影響性能。 – wmorrison365

相關問題