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

2021-08-25 21:48:35 字數 1454 閱讀 6284

對於乙個存諸過程,如果返回的結果是我們預先知道的,那麼可以根據儲存過程定義的順序來進行

處理(事實上一般不會這樣),但對於複雜的多結果集的處理,如何定義乙個通用的流程?

我們先看一下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();

dors = cs.getresultset();

if(rs != null)

//如果到了這裡,說明updatecount == -1 && rs == null,什麼也沒的了

}while(!(updatecount == -1 && rs == null));

cs.get***(int);//獲取輸出引數

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

對於乙個存諸過程,如果返回的結果是我們預先知道的,那麼可以根據儲存過程定義的順序來進行 處理 事實上一般不會這樣 但對於複雜的多結果集的處理,如何定義乙個通用的流程?我們先看一下jdbc本身能為我們提供什麼?乙個儲存過程執行後返回的是boolean型 boolean flag callablesta...

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

對於乙個存諸過程,如果返回的結果是我們預先知道的,那麼可以根據儲存過程定義的順序來進行 處理 事實上一般不會這樣 但對於複雜的多結果集的處理,如何定義乙個通用的流程?我們先看一下jdbc本身能為我們提供什麼?乙個儲存過程執行後返回的是boolean型 booleanflag callablestat...

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

對於乙個存諸過程,如果返回的結果是我們預先知道的,那麼可以根據儲存過程定義的順序來進行 處理 事實上一般不會這樣 但對於複雜的多結果集的處理,如何定義乙個通用的流程?我們先看一下jdbc本身能為我們提供什麼?乙個儲存過程執行後返回的是boolean型 booleanflag callablestat...