用Java Class創建Oracle存儲過程


一、背景

前不久,領導布置了一個任務,要在Oracle端以存儲過程(函數)的方式調用Java class類。經過一兩天折騰,搞定了任務,現在做個簡單總結。

 

二、實現方式

整個過程有兩個步驟:創建Java class和創建存儲過程,其中創建存儲過程(函數)必須在Oracle端進行,而創建java class則有兩種方式,第一種是直接在Oracle端進行,第二種是Java IDE中生成class后再導入到Oracle。

經測試,兩種方式的效果相同。為方便調試,先按第一種方式進行,成功后將class和函數刪除,再按第二種方式重新創建。

 

三、具體過程

3.1 在Oracle端創建Java class

在Sqlplus或Pl-Sql Developer的sql窗口中進行,示例代碼如下:

create or replace and compile java source named javatest as

public class JavaTest

{

  public static String FuncTest (String data, String key)

  {

    return "This is " + data + "...  || This is " + key + "...";

  }

}

執行后,會分別生成一個名為javatest的Java Source對象和Java class對象。

 

3.2 在Oracle端創建存儲過程

同樣在Oracle端中進行,示例代碼如下:

create or replace function f_javatest_functest(p_data in varchar2, p_key in varchar2) return varchar2 as

language java name 'JavaTest.FuncTest(java.lang.String, java.lang.String) return java.lang.String';

執行后,會生成一個名為f_javatest_functest的函數。

此后,可以在sql語句中調用該函數:

select f_javatest_functest('This is data...', 'This is key...') from dual;

This is data... || This is key...

 

3.3 刪掉Java Source和函數

在Oracle端中刪掉上述步驟中創建的Java Source(會自動刪掉Java class,反之則不會)和函數。細節略。

 

3.4 在IDE中創建java class

在Java IDE中創建相同的class,源文件(.java)或類文件(.class)均可。如果是類文件,要注意編譯時JDK須與oracle的JVM保持一致,11g對應JDK1.5,10g對應1.4。細節略。

 

3.5 向Oracle導入java class

這里需要使用oracle提供的loadjava命令行工具,它可以導入源文件、類文件、依賴包及資源文件等等。該工具與sqlplus在同一目錄。

如果該類使用了其它依賴包或資源文件,須在導入該類之前先導入它們:

loadjava -u username/password -r -v D:\JarPath\yourjar.jar

loadjava -u username/password -r D:\PropPath\yourprop.properties

考慮到JVM版本差異問題,推薦導入源文件(.java):

loadjava -u username/password -r -v D:\Path\JavaTest.java

如果不存在JVM版本差異,可以直接導入類文件(.class):

loadjava -u username/password -r D:\Path\JavaTest.class

導入成功后,可在oracle端中查詢到新生成了Java class對象,但沒有Java Source對象。因此采用這種方式可以隱藏代碼實現細節。

有關loadjava的具體用法,參見loadjava --help

 

3.6 重新創建存儲過程

與3.2相同,從略。

 

3.7 刪掉或更改java class、依賴包、資源文件

如果是刪除單個class,是可以在Sqlplus或Pl-Sql Developer中進行的。但這種方式難以應付有多個依賴包、資源文件的情況,此時要使用dropjava工具。具體用法從略。

在更改java class、依賴包、資源文件后,需要重新編譯存儲過程(函數)。

 

四、注意事項

  • 存儲過程(函數)應盡量少依賴外部jar包,尤其是有嵌套依賴情形的jar,目前沒搜索到如何自動加載嵌套依賴class、以及如何防止依賴class沖突的方法;
  • 某些情況下,可能需要事先以SYSDBA對用戶賦予相應權限,例如:

EXEC Dbms_Java.Grant_Permission('USERNAME','SYS:java.lang.RuntimePermission', '*', 'read , write, execute, delete');

注意:USERNAME若非系統事先所建用戶,必須全大寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM