oracle數據庫的開發很是靈活,不只支持最基本的SQL,並且還提供了獨有的PL/SQL,除此以外,還能夠用時下最流行的編程語言Java來作開發。隨着對oracle的瞭解愈來愈多,愈來愈禁不住oracle的誘惑,oracle技術真的是一門頗有趣的學問。以前,我在博客中總結了挺多有關SQL、PL/SQL的,可是對於oracle數據庫中Java類的調用卻沒有總結,也是由於以前不太會,這會兒總結了一下,特來分享。html
一、oracle中調用Java類的基本思路java
要在oracle中調用Java類來實現存儲過程、函數,我覺的大概的思路是這樣的:sql
(1)首先編寫Java代碼,能夠用本身喜歡的代碼編輯器編輯,編輯好了之後,能夠將代碼編譯成.class文件,也能夠打成jar包,也能夠啥都不操做,就是一個Java源代碼文件在那放着。數據庫
(2)想辦法將已經寫好的Java代碼導入到oracle數據庫中,這裏導入主要有兩種方法,一種是使用loadjava命令,另外一種是直接在編寫PL/SQL代碼的時候寫Java代碼,這兩種方法我在下面會詳細總結。編程
(3)編寫存儲過程、函數來封裝Java代碼,以實現後面對Java功能的調用。oracle
(4)準備工做已經作完了,最後就是調用了,調用的方式與PL/SQL徹底同樣,沒啥不一樣的。編程語言
二、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
三、舉例說明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中是否是仍是蠻激動的,功能一會兒就有擴展了許多。