關於多結果集的存儲過程的處理

對於一個存諸過程,如果返回的結果是我們預先知道的,那麼可以根據存儲過程定義的順序來進行
處理(事實上一般不會這樣),但對於複雜的多結果集的處理,如何定義一個通用的流程?

我們先看一下JDBC本身能爲我們提供什麼?
一個存儲過程執行後返回的是boolean型:
boolean flag = callableStatement.execute();
如果flag爲true,那麼說明返回了一個結果集(ResultSet)類型,你可以用getResultSet()得到當前行所在
的結果,而如果返回爲flase,說明什麼呢?

如果你不進行處理,什麼也不能說明,只能說明當前指針不是ResultSet,有可能是更新計數(updateCount)
也可能什麼也沒有反因.

那麼如果當前指針爲flase時如何處理?我們應該先getUpdateCount();如果返回-1,既不是結果集,又
不是更新計數了.說明沒的返回了.而如果getUpdateCount()返回0或大於0,則說明當前指針是更新計數(
0的時候有可能是DDL指令).無論是返回結果集或是更新計數,那麼則可能還繼續有其它返回.只有在當前
指指針getResultSet()==null && getUpdateCount() == -1才說明沒有再多的返回.

存儲過程的返回和ResultSet類似,每次處理的返回結果相當於是ResultSet的Row,只不過存儲過程的Row
最先在第一行而不是象ResultSet要先next纔到第一行,存儲過程向下移動一行用getMoreResults(),相
當於ResultSet的next().同樣它返回boolean和上面的flag一樣,只是說明當前行是不是ResultSet,如果是
flase,你還是要判斷是不是updateCount,在每一行,都要先同時判斷是否爲ResultSet還是UpdateCount,如
果是其中一種則要繼續getMoreResults(),當不是ResultSet也不是updateCount時,說明沒有返回結果了,
這時再獲取輸出參數.

看明白了嗎?

那我們就根據上面的規則來寫一個通用的流程吧:

首先,我們要確定什麼時候沒說結果集了:
if(cs.getResultSet() == null && cs.getUpdateCount() == -1)
現在我們做一個循環:
ResultSet rs = null;
int updateCount = -1;
flag = cs.execute();
do{
updateCount = cs.getUpdateCount();
if(updateCount != -1){//說明當前行是一個更新計數
//處理.
cs.getMoreResults();
continue;//已經是更新計數了,處理完成後應該移動到下一行
//不再判斷是否是ResultSet
}
rs = cs.getResultSet();
if(rs != null){//如果到了這裏,說明updateCount == -1
//處理rs
cs.getMoreResults();
continue;
//是結果集,處理完成後應該移動到下一行
}
//如果到了這裏,說明updateCount == -1 && rs == null,什麼也沒的了

}while(!(updateCount == -1 && rs == null));
cs.getXXX(int);//獲取輸出參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章