周 嵐 孔鯤鵬
(1蕪湖信息技術(shù)職業(yè)學(xué)院,安徽 蕪湖 241003)
(2巢湖學(xué)院,安徽 巢湖 238000)
Oracle中基于Java的存儲(chǔ)過(guò)程開(kāi)發(fā)研究
周 嵐1孔鯤鵬2
(1蕪湖信息技術(shù)職業(yè)學(xué)院,安徽 蕪湖 241003)
(2巢湖學(xué)院,安徽 巢湖 238000)
存儲(chǔ)過(guò)程是一種數(shù)據(jù)庫(kù)對(duì)象,將執(zhí)行計(jì)劃存儲(chǔ)在數(shù)據(jù)庫(kù)的服務(wù)器中,它的執(zhí)行速度比獨(dú)立執(zhí)行同樣的程序要快。任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該用到存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程可以使得對(duì)數(shù)據(jù)庫(kù)的管理、顯示關(guān)于數(shù)據(jù)庫(kù)及其用戶(hù)信息的工作容易很多。文中詳細(xì)分析了Java存儲(chǔ)過(guò)程的開(kāi)發(fā)步驟。
Java存儲(chǔ)過(guò)程;Oracle9i數(shù)據(jù)庫(kù);Java函數(shù)
1.1 存儲(chǔ)過(guò)程的概念
存儲(chǔ)過(guò)程是一種數(shù)據(jù)庫(kù)對(duì)象,將執(zhí)行計(jì)劃存儲(chǔ)在數(shù)據(jù)庫(kù)的服務(wù)器中,它的執(zhí)行速度比獨(dú)立執(zhí)行同樣的程序要快。存儲(chǔ)過(guò)程可以使得對(duì)數(shù)據(jù)庫(kù)的管理、顯示關(guān)于數(shù)據(jù)庫(kù)及其用戶(hù)信息的工作容易很多。存儲(chǔ)過(guò)程可以包含數(shù)據(jù)流、邏輯以及對(duì)數(shù)據(jù)庫(kù)的查詢(xún)。在Oracle9i中應(yīng)用開(kāi)發(fā)人員除了可使用PL/SQL還可以使用Java來(lái)開(kāi)發(fā)他們的業(yè)務(wù)邏輯,并將這個(gè)業(yè)務(wù)邏輯作為存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)程序部署在數(shù)據(jù)庫(kù)中。
當(dāng)調(diào)用Java存儲(chǔ)過(guò)程時(shí),數(shù)據(jù)庫(kù)會(huì)直接運(yùn)行該存儲(chǔ)過(guò)程,無(wú)需進(jìn)行編譯。相對(duì)于SQL語(yǔ)句或PL/SQL塊而言,其執(zhí)行速度更快。
1.2 設(shè)計(jì)存儲(chǔ)過(guò)程的方針
1.2.1 在定義存儲(chǔ)過(guò)程時(shí),要使用其完成單一、相對(duì)集中的任務(wù)。
1.2.2 在定義存儲(chǔ)過(guò)程時(shí),不要定義已經(jīng)由其它特征所提供功能的過(guò)程。例如,不要定義強(qiáng)制數(shù)據(jù)完整性的過(guò)程(使用完整性約束)。
1.3 存儲(chǔ)過(guò)程的類(lèi)型
Oracle9i支持四種不同類(lèi)型的存儲(chǔ)過(guò)程,用PL/SQL或Java,都可以實(shí)現(xiàn)全部四種類(lèi)型的存儲(chǔ)過(guò)程。這四種存儲(chǔ)過(guò)程類(lèi)型是:“存儲(chǔ)過(guò)程、存儲(chǔ)函數(shù)、數(shù)據(jù)庫(kù)觸發(fā)器和對(duì)象類(lèi)型方法”。[1]
1.4 存儲(chǔ)過(guò)程的調(diào)用
在Oracle9i里,這四種存儲(chǔ)程序類(lèi)型的每一種,都可以從不同的調(diào)用環(huán)境調(diào)用,這些調(diào)用環(huán)境是:“SQL語(yǔ)句或DML語(yǔ)句、頂級(jí)CALL語(yǔ)法、PL/SQL塊、子程序(包)和觸發(fā)器的隱式調(diào)用”。[2]
2.1 創(chuàng)建Java存儲(chǔ)過(guò)程的一般步驟
2.1.1 Java存儲(chǔ)過(guò)程的開(kāi)發(fā)步驟:編寫(xiě)Java源代碼、裝載Java代碼及類(lèi)到Oracle9i數(shù)據(jù)庫(kù)中、生成調(diào)用說(shuō)明和調(diào)用JSP。
要將Java方法轉(zhuǎn)換為Java存儲(chǔ)過(guò)程需要幾個(gè)步驟,包括:用loadjava實(shí)用程序?qū)ava類(lèi)加載到數(shù)據(jù)庫(kù)中,利用調(diào)用規(guī)范(“Call Spec”[3])發(fā)布Java方法,將Java方法、參數(shù)類(lèi)型和返回類(lèi)型映射到其SQL的對(duì)應(yīng)部分。
2.1.2 編寫(xiě)Java源代碼
當(dāng)開(kāi)發(fā)Java存儲(chǔ)過(guò)程時(shí),首先應(yīng)該編寫(xiě)Java源代碼。如下所示:
2.1.3 裝載Java代碼及類(lèi)到Oracle9i數(shù)據(jù)庫(kù)中
在編寫(xiě)了Java源代碼之后,接下來(lái)應(yīng)該將Java代碼及相應(yīng)的Java類(lèi)裝載到Oracle9i數(shù)據(jù)庫(kù)中。如圖1所示:
圖1 Oracle9i中的Java類(lèi)
裝載Java代碼及類(lèi)到RDBMS有以下兩種方法:
?使用loadjava工具,通過(guò)該工具可以快速裝載 Java 源代碼(.java)、Java 二進(jìn)制代碼(.class)以及 Java 打包文件(.jar)。
? 使用CREATE Java、ALTER Java裝載 Java代碼。
2.1.4 生成調(diào)用說(shuō)明
在裝載了Java類(lèi)之后,接下來(lái)應(yīng)該生成對(duì)public static方法的調(diào)用說(shuō)明,最終完成Java存儲(chǔ)過(guò)程的開(kāi)發(fā)工作。
完成上述步驟之后,就完成了Java存儲(chǔ)過(guò)程的開(kāi)發(fā)工作,然后就可以調(diào)用并執(zhí)行該Java存儲(chǔ)過(guò)程了。
2.2 使用 Java開(kāi)發(fā)過(guò)程
過(guò)程用于執(zhí)行某種操作。需要注意的是,過(guò)程所對(duì)應(yīng)的Java方法返回值必須為空(void)。本節(jié)以創(chuàng)建用于插入、修改和刪除THEACHERS表的JSP為例,說(shuō)明使用Java開(kāi)發(fā)過(guò)程的方法。如圖2所示:
圖2 使用Java開(kāi)發(fā)過(guò)程示例
下面講述完成上述任務(wù)的方法及過(guò)程:
2.2.1 編寫(xiě)Java源代碼
程序清單如下(manipulate_teachers.java):
/*建立到數(shù)據(jù)庫(kù)的缺省連接*/
/*構(gòu)造動(dòng)態(tài)SQL語(yǔ)句*/
/*使用try...catch語(yǔ)句抓取并拋出例外*/try{
/*準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句*/
/*設(shè)置動(dòng)態(tài)SQL參數(shù)值*/
2.2.2 裝載Java代碼及類(lèi)到Oracle9i數(shù)據(jù)庫(kù)中
在編寫(xiě)了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle9i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
//設(shè)置環(huán)境變量classpath
2.2.3 發(fā)行Java,生成調(diào)用說(shuō)明
在裝載了Java類(lèi)后,就可以發(fā)行該Java類(lèi),并生成調(diào)用其方法的過(guò)程說(shuō)明了。下面是完成該項(xiàng)任務(wù)的方法:
2.2.4 調(diào)用JSP
在生成了調(diào)用Java方法的過(guò)程說(shuō)明之后,我們就可以調(diào)用JSP了。例如://插入一條記錄
2.2.5 分析
在這我們使用了Java存儲(chǔ)過(guò)程,與PL/SQL相比,使用Java語(yǔ)言開(kāi)發(fā)存儲(chǔ)過(guò)程只被發(fā)送到數(shù)據(jù)庫(kù)一次,相對(duì)于SQL語(yǔ)句或PL/SQL塊而言,其網(wǎng)絡(luò)通信量更小。而且當(dāng)調(diào)用Java存儲(chǔ)過(guò)程時(shí),數(shù)據(jù)庫(kù)會(huì)直接運(yùn)行該存儲(chǔ)過(guò)程,無(wú)需進(jìn)行編譯。相對(duì)于SQL語(yǔ)句或PL/SQL塊而言,它省去了編譯的時(shí)間,因此其執(zhí)行速度更快。
2.3 使用Java開(kāi)發(fā)函數(shù)
函數(shù)用于返回特定數(shù)據(jù)。可通過(guò)創(chuàng)建用于返回教師所教授的課程標(biāo)題,以及課程數(shù)為例,說(shuō)明使用Java開(kāi)發(fā)函數(shù)的方法。如圖3所示:
圖3 使用Java開(kāi)發(fā)函數(shù)示例
任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該用到存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程可以使得對(duì)數(shù)據(jù)庫(kù)的管理、顯示關(guān)于數(shù)據(jù)庫(kù)及其用戶(hù)信息的工作容易很多。存儲(chǔ)過(guò)程可以幫助你在代碼中分離邏輯。Oracle數(shù)據(jù)庫(kù)與Java VM的集成可以創(chuàng)建可移植、功能強(qiáng)大和數(shù)據(jù)庫(kù)無(wú)關(guān)的數(shù)據(jù)邏輯和持續(xù)性邏輯。Java語(yǔ)言具有更強(qiáng)大的運(yùn)算能力,提供了更多的運(yùn)算方法,可以應(yīng)用于更多的數(shù)據(jù)庫(kù)系統(tǒng)(如 Sybase、DB2、Informix 等等)。 Java的存儲(chǔ)過(guò)程可以解決不同數(shù)據(jù)庫(kù)廠(chǎng)商使用各種專(zhuān)有的、且依賴(lài)于數(shù)據(jù)庫(kù)的實(shí)現(xiàn)語(yǔ)言的問(wèn)題。利用 Java 存儲(chǔ)過(guò)程溝通 SQL、XML、Java、J2EE 和Web服務(wù)。
[1]Kevin Loney,Marlene Theriault等著,蔣蕊,王磊等譯.Oracle 9i DBA 手冊(cè)[M].北京:機(jī)械工業(yè)出版社,2005.
[2]John Carnell等著,康博譯.Oracle 9i Java程序設(shè)計(jì)—使用PL/SQL和Java的解決方案[M].北京:清華大學(xué)出版社,2002.
[3]丁岳偉,彭敦陸編著.Java程序設(shè)計(jì)[M].北京:高等教育出版社,2005.
[4]周悅芝著.Oracle J2EE應(yīng)用開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2005.
[5]王洪,朱銳.數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程設(shè)計(jì)及應(yīng)用[J].電子信息對(duì)抗技術(shù),2009,(2):59-63.
RESEARCH AND DEVELOPMENT OF JAVA STORED PROCEDURES IN ORACLE
ZHOU Lan1KONG Kun-peng2
(1 Wuhu Vocational College of Information Technology,Wuhu Anhui 241003)
(2 Chaohu University,Chaohu Anhui 238000)
Stored procedure is a database object which saves plans in database server, so it runs faster.Any well designed database application should adopt stored procedure, for it makes the management of database, the display of database and users informationeasier.In this paper we analyze in detail the developing steps of stored procedure in Java.
stored procedure in Java; Oracle9i database; function in Java
TP311.52
A
1672-2868(2010)06-0030-04
2010-06-15
安徽省青年優(yōu)秀人才基金(項(xiàng)目編號(hào):2009SQRZ224)
周嵐(1978-),女,安徽績(jī)溪人。蕪湖信息技術(shù)學(xué)院軟件工程系教師,講師,碩士,研究方向:軟件技術(shù)。
責(zé)任編輯:陳 侃