Oracle 存儲過程
簡要記錄存儲過程語法與Java程序的調用方式
一 存儲過程
首先,我們建立一個簡單的表進行存儲過程的測試
1)無返回值的存儲過程
2)有單個數據值返回的存儲過程
其中,以上兩種與sql server基本類似,而對於返回數據集時,上述方法則不能滿足我們的要求。在Oracle中,一般使用ref cursor來返回數據集。示例代碼如下:
3)有返回值的存儲過程(列表返回)
首先,建立我們自己的包。並定義包中的一個自定義ref cursor
在定義了ref cursor後,可以書寫我們的程序代碼
二、程序調用
在本節中,我們使用java語言調用存儲過程。其中,關鍵是使用CallableStatement這個對象,代碼如下:
String oracleDriverName =
"oracle.jdbc.driver.OracleDriver" ;
// 以下使用的Test就是Oracle裏的表空間
String oracleUrlToConnect =
"jdbc:oracle:thin:@127.0.0.1:1521:orcl" ;
Connection myConnection =
null ; try
{ Class.forName(oracleDriverName);
}
catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
try
{ myConnection = DriverManager.getConnection(oracleUrlToConnect,
"xxxx" ,
"xxxx" ); //此處爲數據庫用戶名與密碼
}
catch (Exception ex) {
ex.printStackTrace();
}
try
{ CallableStatement proc= null ;
proc=myConnection.prepareCall( "{call xs_proc(?,?)}" );
proc.setString( 1 ,
"zhangsan" );
proc.registerOutParameter( 2 , Types.NUMERIC);
proc.execute();
String teststring=proc.getString( 2 );
System.out.println(teststring);
}
catch (Exception ex) {
ex.printStackTrace();
} |
對於列表返回值的存儲過程,在上述代碼中做簡單修改。如下
上述存儲過程修改完畢。另外,一個複雜的工程項目中的例子:查詢一段數據中間隔不超過十分鐘且連續超過100條的數據。即上述代碼所調用的getdcsj存儲過程
create
or replace procedure
getDcsj(var_flag in
varchar2, var_jzbh
in varchar2,
number_total
out number,
var_cursor_a
out mypackage.my_cursor,
var_cursor_b
out mypackage.my_cursor)
is total number;
cursor
cur is select
sj, flag from
d_dcsj where
jzbh = var_jzbh order
by sj desc for
update ; last_time
date ; begin for
cur1 in
cur loop if last_time
is null
or cur1.sj >= last_time - 10 / 60 / 24 then update
d_dcsj set
flag = var_flag where
current of cur;
last_time := cur1.sj;
else select
count (*) into
total from
d_dcsj where flag = var_flag;
dbms_output.put_line(total);
if total < 100
then update
d_dcsj set
flag = null where
flag = var_flag; last_time :=
null ; update
d_dcsj set
flag = var_flag where
current of cur;
else open
var_cursor_a for select
* from
d_dcsj where
flag = var_flag and
jzbh = var_jzbh and
zh = 'A' order
by sj desc ;
number_total := total;
open
var_cursor_b for select
* from
d_dcsj where
flag = var_flag and
jzbh = var_jzbh and
zh = 'B' order
by sj desc ;
number_total := total;
exit;
end
if; end
if; end
loop; select
count (*) into
total from
d_dcsj where flag = var_flag;
dbms_output.put_line(total);
if total < 100
then open
var_cursor_a for select
* from
d_dcsj where zh =
'C' ; open
var_cursor_b for select
* from
d_dcsj where zh =
'C' ; else open
var_cursor_a for select
* from
d_dcsj where
flag = var_flag and
jzbh = var_jzbh and
zh = 'A' order
by sj desc ;
number_total := total;
open
var_cursor_b for select
* from
d_dcsj where
flag = var_flag and
jzbh = var_jzbh and
zh = 'B' order
by sj desc ;
number_total := total;
end
if; commit ;
end ;
/ |