Oracle數據庫中調用Java類開發存儲過程、函數的方法
oracle數據庫的開發非常靈活,不僅支持最基本的SQL,而且還提供了獨有的PL/SQL,除此之外,還可以用時下最流行的編程語言Java來做開發。隨着對oracle的了解越來越多,越來越禁不住oracle的誘惑,oracle技術真的是一門很有趣的學問。之前,我在博客中總結了挺多有關SQL、PL/SQL的,但是對於oracle數據庫中Java類的調用卻沒有總結,也是因為之前不太會,這會兒總結了一下,特來分享。
1、oracle中調用Java類的基本思路
要在oracle中調用Java類來實現存儲過程、函數,我覺的大概的思路是這樣的:
(1)首先編寫Java代碼,可以用自己喜歡的代碼編輯器編輯,編輯好了以后,可以將代碼編譯成.class文件,也可以打成jar包,也可以啥都不操作,就是一個Java源代碼文件在那放着。
(2)想辦法將已經寫好的Java代碼導入到oracle數據庫中,這里導入主要有兩種方法,一種是使用loadjava命令,另一種是直接在編寫PL/SQL代碼的時候寫Java代碼,這兩種方法我在下面會詳細總結。
(3)編寫存儲過程、函數來封裝Java代碼,以實現后面對Java功能的調用。
(4)准備工作已經做完了,最后就是調用了,調用的方式與PL/SQL完全一樣,沒啥不同的。
2、loadjava命令介紹
在切入正題之前,先簡單介紹下loadjava命令及其用法,loadjava命令有很多的參數,也沒有必要全部都了解,loadjava的調用規則如下圖1所示:
圖1:loadjava的調用規則
loadjava命令不是在sql*plus中調用的,而是在cmd窗口中,有關loadJava的各個參數的意思,可以使用:loadjava -help 命令來獲得詳細幫助。本文中主要用到的參數有-u(用於輸入用戶名及密碼)、-v(用於輸出詳細的反饋信息)、-resolve(對於沒有編譯的Java文件,可以用resolve來編譯)、-f(這個命令我在例子中沒有用到,它的意思是force,表示不管之前是否已經導入過該Java類,都強制再次導入)。loadjava可以實現對class文件、jar文件、resource文件、property文件的導入,當導入class文件時,可以用如下命令:
loadjava –u username/userpassword –v filename.class
當導入Java文件時,可以用如下命令:
loadjava –u username/userpassword –v -resolve filename.java
當導入jar文件時,可以用如下命令:
loadjava –u username/userpassword –v -resolve filename.jar
3、舉例說明oracle調用Java全步驟
例子:一個簡單的需求,用Java代碼實現求圓的面積,圓周率PI為3.14,輸入的參數為圓的半徑R,輸出圓的面積S,要求可以在oracle中用PL/SQL代碼調用該Java類實現求圓的面積的功能。
Step 1:編寫Java代碼,PL/SQL Developer本身雖然支持編寫Java代碼,但是畢竟不是專業的,對Java的工具提供的不是特別好,我喜歡用MyEclipse開發好以后復制過來,下面是我在MyEclipse中開發好的代碼。
// 圓工具類,計算圓的面積 public class CircleTools { // 定義常量PI public static final double PI = 3.14; // 計算面積 public static double calcSquare(double r) { return PI * r * r; } }
注意在寫Java代碼的時候,為了能夠直接能夠在oracle中被調用,所以這里在需要調用的方法前要加上public和static。
Step 2:寫好Java代碼,下面就是要將Java導入到oracle數據庫中,導入的方法在前文提到過可以用loadJava或者直接寫。如果要用loadJava導入,先把上面的代碼文件保存為CircleTools.java,然后在cmd命令行中進入該目錄下,然后執行如下命令:
loadjava –u username/userpassword –v -resolve CircleTools.java
執行上面的命令就OK了,下面提供另一種方法,就是直接在PL/SQL中寫,寫法如下:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED circletools AS // 圓工具類,計算圓的面積 public class CircleTools { // 定義常量PI public static final double PI = 3.14; // 計算面積 public static double calcSquare(double r) { return PI * r * r; } }
我的oracle開發工具是PL/SQL Developer,所以我在PL/SQL Developer中執行了上面這段代碼,然后查詢user_objects表,可以發現CircleTools類已經被導入進了oracle數據庫中,如下圖2所示:
圖2:user_objects表中查詢到CircleTools類
Step 3:編寫存儲過程(procedure)或者函數(function)來封裝,以實現以后的調用,一般來說,如果一個Java方法沒有返回值,那么就封裝成存儲過程,如果有返回值,就封裝成函數,這里我只給出一個封裝成函數的例子:
CREATE OR REPLACE FUNCTION calc_square(r IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'CircleTools.calcSquare(double) return double';
Step 4:上面幾步基本上已經實現了全部了,最后一步測試一下,我test了一下calc_square這個函數,結果如下圖3所示:
圖3:測試calc_square函數
Step 5:如果不想用那個Java類了,可以用dropjava命令刪除掉系統中的Java,這個跟loadjava很相似,下面截圖:
圖4:dropjava命令
例如:
dropjava -user username/userpassword@db -v javasourcename
注意上面刪除的是Java的source name,不是class name,即對象的OBJECT_TYPE是JAVA SOURCE,不是JAVA CLASS。這個地方我不太確定,不過我直接刪除類名是報錯了,先這樣寫着吧,后面發現錯了,我會糾正的。
在oracle中調用Java source的思路大概就是上面這樣,一想到可以把Java代碼跑在oracle中是不是還是蠻激動的,功能一下子就有擴展了許多。