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

最近在工作中遇到了遇到了一個需求需要將TIPTOP中的數據導出成XML並上傳到FTP主機中,但是4GL這方面的文檔比較少最終決定使用Oracle調用Java的方法,在使用的過程中發現有很多的坑,大部分的博客只粗略的介紹了下導致耗費了很多時間,在這裏分兩個博文詳細的記錄一下這個功能,填一下坑,希望可以幫助到大家。

首先 每個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';

執行腳本時間比較長要耐心等待一會,安裝完成后需要根據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方法若需要用到其他價包,報ORA-29521找不到類的錯 將在下一個博客中說到)

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包來實現自己的業務邏輯,或者發生了ORA-29521: referenced name java/xxx/xxx/xxx could not be found錯誤那麼這些問題將在下一篇中說到。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化