ストアド・プロシージャの構文とJavaプログラムの呼び出し方法を簡単に記録
まず、ストレージ・プロシージャのテストのための簡単なテーブルを作成します.
create table
xuesheng(id integer, xing_ming varchar2(25), yu_wen number, shu_xue number);
insert into xuesheng values(1,'zhangsan',80,90)
insert into xuesheng values(2,'lisi',85,87)
1)戻り値のないストアド・プロシージャ
create or replace procedure xs_proc_no is
begin
insert into xuesheng values (3, 'wangwu', 90, 90);
commit;
end xs_proc_no;
2)単一のデータ値が返されるストアド・プロシージャ
create or replace procedure xs_proc(temp_name in varchar2,
temp_num out number) is
num_1 number;
num_2 number;
begin
select yu_wen, shu_xue
into num_1, num_2
from xuesheng
where xing_ming = temp_name;
--dbms_output.put_line(num_1 + num_2);
temp_num := num_1 + num_2;
end;
このうち,以上の2つはsql serverとほぼ同様であるが,データセットを返す場合,上記の方法では我々の要求を満たすことができない.Oracleでは、ref cursorを使用してデータセットを返すのが一般的です.サンプルコードは次のとおりです.
3)戻り値のあるストアド・プロシージャ(リスト戻り)
まず、私たち自身のバッグを作ります.パッケージ内のカスタムref cursorを定義します
create or replace package mypackage as
type my_cursor is ref cursor;
end mypackage;
ref cursorを定義したら、私たちのプログラムコードを書くことができます.
create or replace procedure xs_proc_list(shuxue in number,
p_cursor out mypackage.my_cursor) is
begin
open p_cursor for
select * from xuesheng where shu_xue > shuxue;
end xs_proc_list;
二、プログラム呼び出し
このセクションでは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();
}
リストから値を返すストレージ・プロシージャについては、上記のコードで簡単に変更します.次のように
CallableStatement proc=null;
proc=myConnection.prepareCall("{call getdcsj(?,?,?,?,?)}");
proc.setString(1, strDate);
proc.setString(2, jzbh);
proc.registerOutParameter(3, Types.NUMERIC);
proc.registerOutParameter(4, OracleTypes.CURSOR);
proc.registerOutParameter(5, OracleTypes.CURSOR);
proc.execute();
ResultSet rs=null;
int total_number=proc.getInt(3);
rs=(ResultSet)proc.getObject(4);
上記のストレージ・プロシージャの変更が完了しました.また、複雑なプロジェクトの例として、データの間隔が10分未満で、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
;
/