java呼叫oracle儲存過程

2021-03-31 17:52:56 字數 3850 閱讀 8324

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...