1. 程式人生 > >Oracle呼叫Java方法(上)如何使用LoadJava命令和如何將簡單的Jar包封裝成Oracle方法

Oracle呼叫Java方法(上)如何使用LoadJava命令和如何將簡單的Jar包封裝成Oracle方法

最近在工作中遇到了遇到了一個需求需要將TIPTOP中的資料匯出成XML並上傳到FTP主機中,但是4GL這方面的文件比較少最終決定使用Oracle呼叫Java的方法,在使用的過程中發現有很多的坑,大部分的部落格只粗略的介紹了下導致耗費了很多時間,在這裡分2個博文詳細的記錄一下這個功能,填一下坑,希望可以幫助到大家。 首先 每個Oracle版本對應的OJVM的版本是不一樣的我的Oracle 版本是 Database 11g Release 2 對應的是jdk1.6 所以寫Java程式碼的時候要注意版本號,其次這個功能是預設關閉的所以需要先安裝OJVM,指令碼安裝語法如下(使用sys使用者登陸sqlplus安裝): 安裝JVM執行環境 @?/javavm/install/initjvm.sql 解除安裝JVM執行環境 @?/javavm/install/rmjvm.sql 查詢OJVM是否安裝成功 SELECT * FROM DBA_REGISTRY WHERE COMP_ID = 'JAVAVM'; ![](https://images.cnblogs.com/cnblogs_com/59nice/1790367/o_200619090028OJVM%E6%98%AF%E5%90%A6%E5%B7%B2%E5%AE%89%E8%A3%85.png) 執行指令碼時間比較長要耐心等待一會,安裝完成後需要根據Java檔案型別來選擇匯入語句 LoadJava引數有 - -u(用於輸入使用者名稱及密碼) - -v(用於輸出詳細的反饋資訊) - -resolve(對於沒有編譯的Java檔案可以用resolve來編譯) - -f(不管之前是否已經匯入過該Java類,都強制再次匯入) 當匯入Class檔案時,可以用如下命令: loadjava –u username/userpassword –v filename.class 當刪除Class檔案時,可以用如下命令: dropjava –u username/userpassword –v filename.class 當匯入Java檔案時,可以用如下命令: loadjava –u username/userpassword –v -resolve filename.java 當刪除Java檔案時,可以用如下命令: dropjava –u username/userpassword –v filename.java 當匯入jar檔案時,可以用如下命令: loadjava –u username/userpassword –v -resolve filename.jar 當刪除jar檔案時,可以用如下命令: dropjava –u username/userpassword –v -resolve filename.jar 如果是比較簡單的Java方法可以直接使用PL/SQL進行編寫,需要呼叫的方法必須是public static 修飾的(Java方法若需要用到其他價包,報找不到類的錯或要用到資料庫中的資料 將在下一個部落格中說到) create or replace and compile java source named JavaName as [Java程式碼] 當使用這種方法的時候可以在PL/SQL 左邊的Java Sources 資料夾中找得到原始碼並編輯,如果匯入的是.Java或.Jar格式的就只能在Java Classes 資料夾中找得到並且不能用PL/SQL編輯. ![](https://images.cnblogs.com/cnblogs_com/59nice/1790367/o_200619090038PLSQL%E4%BD%8D%E7%BD%AE.png) 如果匯入正常的話使用下面的語句可以查詢已經匯入的Java類,查詢出來的狀態必須是"VALID",否則Oracle則不能呼叫必須解決報錯資訊重新匯入才能呼叫 SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE LIKE 'JAVA%' ![](https://images.cnblogs.com/cnblogs_com/59nice/1790367/o_200619090044%E5%AF%BC%E5%85%A5%E7%9A%84Java%E7%8A%B6%E6%80%81.png) 以上程式碼都執行完成後就可以將Java程式碼封裝成成Oracle 方法(function) ,儲存過程(Procedures) 這2個主要是返回值的區別 如果有返回值可以封裝成function ,沒有返回值可以封裝成Procedures,如果有多個返回值...emmmm Java沒有多個返回值=。= 我需要封裝成function則封裝的語句如下: CREATE OR REPLACE FUNCTION FunctionName(str1 NVARCHAR2, str2 NVARCHAR2, str3 NVARCHAR2, str4 NVARCHAR2, str5 NVARCHAR2) RETURN NVARCHAR2 AS LANGUAGE JAVA NAME 'com/xxx/xxx/xxx/xxx.ClassName(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String) return java.lang.String'; 這個語句需要注意2點其一就是Java方法的包名需要用“/”分割而類名用“.” 這個當時卡了很久算是一個坑,其二Java方法的傳入型別要和資料庫型別相對應例如: NVARCHAR2和String ,更詳細的對應關係可以看[Oracle 官方的文件](https://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm#BABEBDGB) ![](https://images.cnblogs.com/cnblogs_com/59nice/1790367/o_200619090057%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B1%BB%E5%9E%8B%E5%92%8CJava%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB.png) 那如果需要傳入的是一大堆表資料呢? 其實這種型別對應並不支援複雜的型別,要想獲得複雜資料 需要在Jar包中加入JDBC包使用JDBC來建立查詢語句來獲取資料 獲取JDBC的Connection物件的時候可以可以這樣寫,不用寫資料庫連結名和賬號密碼,可以直接使用資料庫的連線。 Connection conn = DriverManager.getConnection("jdbc:default:connection:"); 詳情也可以參照[Oracle官方文件](http://https://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm#BABEBDGB)中的這一單元:Using the Server-Side Internal JDBC Driver ![](https://images.cnblogs.com/cnblogs_com/59nice/1790367/o_200619090053%E9%BB%98%E8%AE%A4JDBC%E8%AF%B4%E6%98%8E.png) 本文主要介紹瞭如何匯入和如何封裝Java方法,如果你的業務邏輯比較複雜需要用到第三方jar包來實現自己的業務邏輯那麼這些坑將在下一篇中