導入jar包
在oracle中導入需要的jar包,我們把編輯好的java類打成jar包,直接在oarcle里面寫簡單的調用就可以了,
1、操作系統需要擁有支持loadjava命令的jdk。
2、加載jlha.jar包,到oracle數據庫中。
操作過程:在dos環境下,輸入命令: loadjava -r -f -o -user usscares/usscares@usscares jlha.jar
注意:jar包要在1.4的環境下編譯,項目右鍵 properties java compiler compoler compliance level 1.4 即可 否則報version 49 類似的錯誤
調用JAVA類
oracle調用JAVA類的方法主要有以下三種:
-
用loadjava方法裝載;
可能是調試方便,據說這種方法比較通用。
c:\test\hello.java
Java Code
| 1 |
public class hello |
C:\test>loadjava -u test/test@mydb -v -resolve hello.java
SQL> create procedure prc_hehe as language java name 'hello.main(java.lang.String[])
過程已創建。
SQL> call prc_hehe();
調用完成。
SQL> set serveroutput on size 2000
SQL> call prc_hehe();
調用完成。
SQL> exec dbms_java.set_output(2000);
PL/SQL 過程已成功完成。
SQL> call prc_hehe();
Hello
This is the method insertM.
調用完成。
SQL>show errors;
修改java類,先刪除再裝載,方法:
dropjava -u test/test@mydb -v -resolve hello.java
loadjava -u test/test@mydb -v -resolve hello.java
-
用sql語句創建
Code
| 1 |
create or replace and compile java source named hehe |
-- 調用結果
SQL> call prc_hehe('oopp');
hello,oopp
-
用外部class文件來裝載創建
create or replace directory CLASS_DIR as 'c:\test';
create or replace java class using bfile(class_dir,'hello.class');
create or replace procedure prc_hello
(
p_name VARCHAR2
)
as
language java name 'hello.msg(java.lang.String)';
-- 測試結果
SQL> call prc_hello('java');
java
可能出現的錯誤
SQL> call prc_hello('Jerry');
call prc_hello('Jerry')
*
第 1 行出現錯誤:
ORA-29516: Aurora 斷言失敗: Assertion failure at eox.c:359
Uncaught exception System error: java/lang/UnsupportedClassVersionError
原因:機器裝了多個java版本,oracle的java版本低於環境變量設置的版本。
解決方法:用$ORACLE_HOME/jdk/javac 重新編譯java文件
核對java已經導入數據庫
select * from user_source where type LIKE 'JAVA%' AND NAME = '<java file>'
建立function
CREATE OR REPLACE FUNCTION <FUNCTION_NAME> (<PARAMETER LIST IN ORACLE DATATYPE>) RETURN <ORACLE DATATYPE OF RETURN VARIABLE> AS
LANGUAGE JAVA
NAME '<clase.method>(<parameter list in java datatype>) return java datatype of return variable';
例:
登陸某一用戶登錄,並創建java程序資源,在pl/sql中java source中顯示你所編寫的java代碼;
SQL Code
| 1 |
create or replace and compile java source named bb_wx_replosssbk as |
創建調用Java資源的函數
create or replace function run_bb_wx_replosssbk(
sSfz in varchar2,
sPwd in varchar2,
sType in varchar2
)
return varchar2
as
language java name 'bb_wx_replosssbk.callProc(java.lang.String,java.lang.String,java.lang.String) return java.lang.String';
建立一過程調用存儲過程
create or replace procedure RUN(
sSfz in varchar2,
sPwd in varchar2,
sType in varchar2
sRtn out varchar2
)
as
begin
--sRtn := run_bb_wx_replosssbk(sSfz in varchar2,sPwd in varchar2,sType in varchar2);
Select run_bb_wx_replosssbk(sSfz in varchar2,sPwd in varchar2,sType in varchar2)
Into sRtn from dual;
end;
/
附:
如果需要java存取文件,需要使用dba用戶賦權
EXEC Dbms_Java.Grant_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
EXEC dbms_java.grant_permission( 'ONBOARDING', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' );
收回權限的語句如下
EXEC Dbms_Java.revoke_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.revoke_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
EXEC dbms_java.revoke_permission( 'ONBOARDING', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' );
