1:首先,我們創(chuàng)建一個簡單的數(shù)據(jù)表,
create table address(addr varchar2(40));
2:然后我們可以創(chuàng)建一個插入數(shù)據(jù)的過程(當然也可以直接手工添加),如下,
create or replace procedure addAddress(addr varchar2) as
begin
insert into address values(addr);
end addAddress;
3: 接下來,我們先創(chuàng)建一個帶有In/Out的存儲過程,如下,
create or replace procedure getAddr(inAddr in varchar2, outAddr out varchar2) as
begin
select addr into outAddr from address where addr=inAddr;
end getAddr;
這個存儲過程可以在SQLPlus中以如下的方式調(diào)用,
DECLARE
TMP varchar2(40);
BEGIN
TMP:=1;
getAddr('test',TMP);
END ;
4:好了,數(shù)據(jù)庫的東西創(chuàng)建完了,我們現(xiàn)在來看看如何通過Java的CallableStatement去掉用這個過程呢? 代碼如下:
1 public void procTest()
2 {
3 try{
4 Connection conn = getConnection("t3://localhost:7001", NonXA_NotSupportGTX_10);
5 System.out.println("connections are retrieved!");
6 CallableStatement stmt = conn.prepareCall("call getAddr(?,?)");
7 stmt.registerOutParameter(2,java.sql.Types.VARCHAR);
8 stmt.setString(1, "test");
9 stmt.executeUpdate();
10 String val = stmt.getString(2);
11 System.out.println("val: " + val);
12 conn.close();
13 }catch(Exception e){
14 e.printStackTrace();
15 }
16 }
這個procedure有兩個bind varible,第一個是input參數(shù),第二個為返回值。調(diào)用這個過程前,我們首先需要將返回值在callable statement中register,即stmt.registerOutParameter(2,java.sql.Types.VARCHAR); 在執(zhí)行statement前,我們需要將input參數(shù)輸入,即stmt.setString(1, "test"); callable statement執(zhí)行后,我們可以通過index來獲取返回值了,即String val = stmt.getString(2);2 {
3 try{
4 Connection conn = getConnection("t3://localhost:7001", NonXA_NotSupportGTX_10);
5 System.out.println("connections are retrieved!");
6 CallableStatement stmt = conn.prepareCall("call getAddr(?,?)");
7 stmt.registerOutParameter(2,java.sql.Types.VARCHAR);
8 stmt.setString(1, "test");
9 stmt.executeUpdate();
10 String val = stmt.getString(2);
11 System.out.println("val: " + val);
12 conn.close();
13 }catch(Exception e){
14 e.printStackTrace();
15 }
16 }