oracle中後台的儲存過程就有fu**tion(函式)和procedure(過程)之分。
其中function是通過第一種方式獲取返回值:
?=call client_no (?,?)。
因為function的是通過return語句返回結果的。
而procedure是沒有return語句的。因此只有通過out型別的引數來返回結果,但通過這種方式可以返回多個結果(多定義幾個out引數就可以),這是function不能實現的。
因此procedure的呼叫就是通過call client_no (?,?)。。。。。。。
一般的通用流程
1.獲取callablestatement語句:(關於callablestatement的用法參考另一篇blog)
callablestatement cs = conn.preparecall("");
2.傳入輸入引數和註冊輸出引數
cs.set***(index,value);//輸入引數
cs.registeroutparameter(index,type);//輸出引數
3.執行儲存過程:
cs.execute();
/***begin 不是原創
*/乙個儲存過程執行後返回的是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時,說明沒有返回結果了,
這時再獲取輸出引數.
/*** end
*/下面的例子我沒有用到上面的方法(^_^),不太會用!
/*************************************
*用到游標取結果集,在oracle中單一的procedure
*無法返回結果集.
*************************************/
/*************************************
*儲存過程部分 begin
*************************************/
//packages
create or replace package gprmi is
-- author : meconsea
-- created : 2005-3-29 15:40:02
-- purpose : 根據資訊id和資訊type獲得處理資訊的詳細情況
-- public type declarations
type outlist is ref cursor;
-- public function and procedure declarations
procedure getproremarkinfo(
infoidarg in workflow.processinfo.infoid%type, --//資訊id
infotypearg in workflow.processinfo.infotype%type, --//資訊型別
result_cursor out outlist
end gprmi;
//package badies
create or replace package body gprmi is
-- function and procedure implementations
procedure getproremarkinfo(
infoidarg in workflow.processinfo.infoid%type, --//資訊id
infotypearg in workflow.processinfo.infotype%type, --//資訊型別
result_cursor out outlist
)isbegin
open result_cursor
forselect a.currentprocessor , c.name as personname, b.currenttache,d.tachename,a.receivedate,a.processdate,a.processremark,a.attitude
from processinfoattach a, processinfo b, operator c,tache d
where a.processinfoid = b.objectid and a.processstatus = 1
and b.infotype = infotypearg and b.infoid = infoidarg
and a.currentprocessor = c.objectid and b.currenttache = d.objectid
order by a.processdate;
end;
end gprmi;
/*************************************
*儲存過程部分 end
*************************************/
/*************************************
*程式部分 begin
*************************************/
/*** 根據資訊型別和資訊id查詢該資訊的處理情況《呼叫儲存過程(getprocessremarkinfo)>
* @param infoid --//資訊id
* @param infotype --//資訊型別
* @return
*/public arraylist getprocessremarkinfo(long infoid, long infotype)";
resultset rs = null;
tryrs.close();
ocs.close();
}catch(exception e)
return al;
}/*************************************
*程式部分 end
*************************************/
Java 呼叫Oracle 儲存過程
呼叫帶返回結果集儲存過程 呼叫帶返回結果集儲存過程 param procname param param return throws sqlexception throws nofreeconnectionexception public datasource execuceproc string ...
JAVA 呼叫Oracle 及儲存過程
try r.close s.close ct.close catch exception e try proc.execute ct.close catch exception e try proc.setstring 1,gq proc.setint 2,24 proc.execute ct.cl...
oracle學習 建立函式呼叫函式及儲存過程
create or replace function f get name t empno in varchar2 return varchar2 is v emp name emp.ename type begin select e.ename into v emp name from emp e...