Oracle存儲過程創(chuàng)建及調(diào)用
在大型數(shù)據(jù)庫系統(tǒng)中,有兩個很重要作用的功能,那就是存儲過程和觸發(fā)器。在數(shù)據(jù)庫系統(tǒng)中無論是存儲過程還是觸發(fā)器,都是通過SQL 語句和控制流程語句的集合來完成的。相對來說,數(shù)據(jù)庫系統(tǒng)中的觸發(fā)器也是一種存儲過程。存儲過程在數(shù)據(jù)庫中運算時自動生成各種執(zhí)行方式,因此,大大提高了對其運行時的執(zhí)行速度。在大型數(shù)據(jù)庫系統(tǒng)如Oracle、SQL Server中都不僅提供了用戶自定義存儲過程的功能,同時也提供了許多可作為工具進行調(diào)用的系統(tǒng)自帶存儲過程。
所謂存儲過程(Stored Procedure),就是一組用于完成特定數(shù)據(jù)庫功能的SQL 語句集,該SQL語句集經(jīng)過編譯后存儲在數(shù)據(jù)庫系統(tǒng)中。在使用時候,用戶通過指定已經(jīng)定義的存儲過程名字并給出相應(yīng)的存儲過程參數(shù)來調(diào)用并執(zhí)行它,從而完成一個或一系列的數(shù)據(jù)庫操作。
由于J2EE體系一般建立大型的企業(yè)級應(yīng)用系統(tǒng),而一般都配備大型數(shù)據(jù)庫系統(tǒng)如Oracle或者SQL Server,在本文《JAVA與Oracle存儲過程》中將介紹JAVA跟Oracle存儲過程之間的相互應(yīng)用跟相互間的各種調(diào)用。
一、JAVA調(diào)用Oracle存儲過程
JAVA跟Oracle之間最常用的是JAVA調(diào)用Oracle的存儲過程,以下簡要說明下JAVA如何對Oracle存儲過程進行調(diào)用。
Ⅰ、不帶輸出參數(shù)情況
過程名稱為pro1,參數(shù)個數(shù)1個,數(shù)據(jù)類型為整形數(shù)據(jù)
import java.sql. * ;
public class ProcedureNoArgs {
public static void main(String args[]) throws Exception
{
// 加載Oracle驅(qū)動
DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver());
// 獲得Oracle數(shù)據(jù)庫連接
Connection conn = DriverManager.getConnection( " jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd " ); 
// 創(chuàng)建存儲過程的對象
CallableStatement c = conn.divpareCall( " {call pro1(?)} " );
// 給Oracle存儲過程的參數(shù)設(shè)置值 ,將第一個參數(shù)的值設(shè)置成188
c.setInt( 1 , 188 );
// 執(zhí)行Oracle存儲過程
c.execute();
conn.close();
}
}
Ⅱ、帶輸出參數(shù)的情況
過程名稱為pro2,參數(shù)個數(shù)2個,數(shù)據(jù)類型為整形數(shù)據(jù),返回值為整形類型
import java.sql.*;
public class ProcedureWithArgs {
public static void main(String args[]) throws Exception
{
//加載Oracle驅(qū)動
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//獲得Oracle數(shù)據(jù)庫連接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd "); 
//創(chuàng)建Oracle存儲過程的對象,調(diào)用存儲過程
CallableStatement c=conn.divpareCall("{call pro2(?,?)}");
//給Oracle存儲過程的參數(shù)設(shè)置值 ,將第一個參數(shù)的值設(shè)置成188
c.setInt(1,188);
//注冊存儲過程的第二個參數(shù) c.registerOutParameter(2,java.sql.Types.INTEGER);
//執(zhí)行Oracle存儲過程
c.execute(); //得到存儲過程的輸出參數(shù)值并打印出來
System.out.println (c.getInt(2));
conn.close();
}
}
Oracle存儲過程包含三部分:過程聲明,執(zhí)行過程部分,存儲過程異常。
Oracle存儲過程可以有無參數(shù)存儲過程和帶參數(shù)存儲過程。
一、無參程序過程語法
2 as
;3 begin
4
;5 exception //存儲過程異常
6
;7 end;
8
二、帶參存儲過程實例
2 sName emp.ename%type;
3 sjob emp.job%type;
4 begin
5 ....
7 exception
....
14 end;
15
三、 帶參數(shù)存儲過程含賦值方式
sname out varchar,sjob in out varchar)
2 as icount number;
3 begin
4 select count(*) into icount from emp where sal>isal and job=sjob;
5 if icount=1 then
6 ....
9 else
10 ....
12 end if;
13 exception
14 when too_many_rows then
15 DBMS_OUTPUT.PUT_LINE('返回值多于1行');
16 when others then
17 DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS過程中出錯!');
18 end;
19
四、在Oracle中對存儲過程的調(diào)用
過程調(diào)用方式一
2 realsal emp.sal%type;
3 realname varchar(40);
4 realjob varchar(40);
5 begin //存儲過程調(diào)用開始
6 realsal:=1100;
7 realname:='';
8 realjob:='CLERK';
9 runbyparmeters(realsal,realname,realjob); --必須按順序
10 DBMS_OUTPUT.PUT_LINE(REALNAME||' '||REALJOB);
11 END; //過程調(diào)用結(jié)束
12
過程調(diào)用方式二
2 realsal emp.sal%type;
3 realname varchar(40);
4 realjob varchar(40);
5 begin //過程調(diào)用開始
6 realsal:=1100;
7 realname:='';
8 realjob:='CLERK';
9 runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); --指定值對應(yīng)變量順序可變
10 DBMS_OUTPUT.PUT_LINE(REALNAME||' '||REALJOB);
11 END; //過程調(diào)用結(jié)束
12
至此,有關(guān)ORACLE的基本存儲過程以及對Oracle存儲過程的調(diào)用方式介紹完畢。

浙公網(wǎng)安備 33010602011771號