最近在工做中遇到了遇到了一個需求須要將TIPTOP中的數據導出成XML並上傳到FTP主機中,可是4GL這方面的文檔比較少最終決定使用Oracle調用Java的方法,在使用的過程當中發現有不少的坑,大部分的博客只粗略的介紹了下致使耗費了不少時間,在這裏分2個博文詳細的記錄一下這個功能,填一下坑,但願能夠幫助到你們。java
首先 每一個Oracle版本對應的OJVM的版本是不同的個人Oracle 版本是 Database 11g Release 2 對應的是jdk1.6 因此寫Java代碼的時候要注意版本號,其次這個功能是默認關閉的因此須要先安裝OJVM,腳本安裝語法以下(使用sys用戶登錄sqlplus安裝):sql
安裝JVM運行環境數據庫
@?/javavm/install/initjvm.sql
卸載JVM運行環境oracle
@?/javavm/install/rmjvm.sql
查詢OJVM是否安裝成功jvm
SELECT * FROM DBA_REGISTRY WHERE COMP_ID = 'JAVAVM';
執行腳本時間比較長要耐心等待一會,安裝完成後須要根據Java文件類型來選擇導入語句
LoadJava參數有ide
當導入Class文件時,能夠用以下命令:code
loadjava –u username/userpassword –v filename.class
當刪除Class文件時,能夠用以下命令:htm
dropjava –u username/userpassword –v filename.class
當導入Java文件時,能夠用以下命令:對象
loadjava –u username/userpassword –v -resolve filename.java
當刪除Java文件時,能夠用以下命令:blog
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編輯.
若是導入正常的話使用下面的語句能夠查詢已經導入的Java類,查詢出來的狀態必須是"VALID",不然Oracle則不能調用必須解決報錯信息從新導入才能調用
SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE LIKE 'JAVA%'
以上代碼都執行完成後就能夠將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 官方的文檔
那若是須要傳入的是一大堆表數據呢? 其實這種類型對應並不支持複雜的類型,要想得到複雜數據 須要在Jar包中加入JDBC包使用JDBC來創建查詢語句來獲取數據 獲取JDBC的Connection對象的時候能夠能夠這樣寫,不用寫數據庫連接名和帳號密碼,能夠直接使用數據庫的鏈接。
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
詳情也能夠參照Oracle官方文檔中的這一單元:Using the Server-Side Internal JDBC Driver
本文主要介紹瞭如何導入和如何封裝Java方法,若是你的業務邏輯比較複雜須要用到第三方jar包來實現本身的業務邏輯那麼這些坑將在下一篇中說到。