oracle 调用java

一、首先最好设置环境变量 PATH 路径为 ORACLE 目录下 bin路径,比如我安装的是绿色版oracle 具体目录是

G:\ORACLE\app\Administrator\product\11.2.0\dbhome_2\BIN


然后再cmd执行

我的java文件存放在E盘wjdc目录下

java 代码


package com.oracle.test;

public class OracleCall {

	public static String run(String str)
	{
		System.out.println("str =[" + str + "]");
		return str;
	}
}



loadjava -u <user>/<passwd>@<tns>  -resolve -v <java file>

这种方法为把sourcecode也load入数据库

 -u---参数表示连接数据库的用户 tns为数据库实例名,默认为orcl, 

 -v---加载时输出详细日志
 - resolve ,-r ---加载时利用oracle jvm进行解析,生成class文件

 -grant public  授权public  公开

自己测试 loadjava -u zbz/123456@orcl -resolve -v OracleCall.java 

最后打印详情

创建成功

执行sql命令查询

SELECT uo.created ,uo.object_name, uo.object_type, dbms_java.longname(uo.object_name),uo.status,uo.*
  FROM user_objects uo WHERE 1=1
 and object_name like '%OracleCall%'
  order by uo.created desc;



那么我们再来删除卸载

删除则将 loadjava 改成 dropjava




再来sql查询看看

同样的sql语句 已经没有 这个user_objects记录了,查不到了 证明成功卸载删除



二、

好了 我们在来测试jar包.加载卸载

先测试下common lang,以前用的比较多很多工具类

loadjava   -u zbz/123456@orcl -resolve -v -fileout ./active.txt commons-lang.jar



active.txt 可以看到输出详细信息

arguments: '-u' 'zbz/***@orcl' '-resolve' '-v' '-fileout' './active.txt' 'commons-lang.jar' 
creating : resource META-INF/MANIFEST.MF
loading  : resource META-INF/MANIFEST.MF
creating : resource META-INF/LICENSE.txt
loading  : resource META-INF/LICENSE.txt
creating : resource META-INF/NOTICE.txt
loading  : resource META-INF/NOTICE.txt
creating : class org/apache/commons/lang/ArrayUtils
loading  : class org/apache/commons/lang/ArrayUtils
creating : class org/apache/commons/lang/BitField
loading  : class org/apache/commons/lang/BitField
creating : class org/apache/commons/lang/BooleanUtils
loading  : class org/apache/commons/lang/BooleanUtils
creating : class org/apache/commons/lang/CharEncoding
loading  : class org/apache/commons/lang/CharEncoding

第一句是命令隐藏了 密码

然后都是create 和load 

都create和load完了后,在执行resolve


resolving: class org/apache/commons/lang/math/DoubleRange
resolving: class org/apache/commons/lang/math/FloatRange
resolving: class org/apache/commons/lang/math/Fraction
resolving: class org/apache/commons/lang/math/IntRange
resolving: class org/apache/commons/lang/math/JVMRandom
resolving: class org/apache/commons/lang/math/LongRange
resolving: class org/apache/commons/lang/math/NumberRange
skipping : class org/apache/commons/lang/math/NumberUtils

再到数据库查询



可以看到一堆apache/commons/lang的包名




(未测试)

加载资源文件ia.properties
为编译维护,把消息服务器IP地址、端口、消息队列名称配置在配置文件中,需加载到数据库中,用户java程序解析该配置文件。

命令形式:
loadjava -user scott/scott@orcl -v ia.properties

注意,ia.properties前不能加其他路径,需在当前路径下执行,否则java程序找不到该配置文件。


(已测试)

通过Oracle数据库调用java程序时,需要进行授权,授权时需要DBA权限用户。本文主要用到以下两种:

 dbms_java.grant_permission( '用户名', '授权权限 可以用*表示所有 ', '消息服务器IP地址:消息port', 'connect,resolve可以用*表示所有,文件操作还有write,read等')

--使用java类加载器时需进行此授权,本例中需要读取配置文件,因此需要此授权
call dbms_java.grant_permission( 'zbz', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '') 

--访问网络时需要进行此授权
call dbms_java.grant_permission( 'zbz', 'SYS:java.net.SocketPermission', '消息服务器IP地址:消息port', 'connect,resolve')


一般如果执行抛异常 则将异常信息的  dbms_java.grant_permission( 'zbz', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '')这种语句拷贝出来

前面加上 call 或者exec dbms_java.grant_permission( 'zbz', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '') 执行就好

 dbms_java.grant_permission( 'zbz', 'SYS:java.net.SocketPermission', '消息服务器IP地址:消息port', 'connect,resolve')



还可以创建目录

create or replace directory UTL_FILE_DIR as 'd:/test'; 
d:/test 必需是已经存在的目录。 
用sys用户登录给要访问的用户指定访问目录的权限。 
GRANT READ ON DIRECTORY UTL_FILE_DIR TO wangyh; 
GRANT WRITE ON DIRECTORY UTL_FILE_DIR TO wangyh;

三、那么我们测试下载入的java类和jar包


编写function 调用 java 程序

用之前的 OracleCall类来测试

成功例子

create or replace  function CallRun(msg varchar2) return VARCHAR2 as


language java name 'com.oracle.test.OracleCall.run(java.lang.String) return java.lang.String';  --需要注意包名




result 就是返回值




命令窗口执行




现在我们改变java'代码


package com.oracle.test;


public class OracleCall {


public static String run(String str)
{
System.out.println("str =[" + str + "]" + System.currentTimeMillis());
return str + System.currentTimeMillis();
}
}


添加毫秒数

再载入一次


命令行执行结果 






测试窗口结果


再次修改java代码 这次需要调用它其他jar包就用之前的commons lang包

package com.oracle.test;


import org.apache.commons.lang3.RandomStringUtils;




public class OracleCall {


public static String run(String str)
{
System.out.println("input str =[" + str + "]" + System.currentTimeMillis());
String random = RandomStringUtils.random(6, new char[]{'1','2','3','4','5','a','b','c','d','e'});
String result = "random=["+ random + "] " + str + System.currentTimeMillis();
return result;
}
 
}



直接加载提示 


找不到这个 inport 的类






genmissing---表示如果该jar包里依赖其他jar包,而其他jar包数据库中并不存在,此时数据库会忽略,并产生该class文件,具体可参见loadjava工具说明。
  f---强制加载
  fileout---输出日志到文件active.txt中


你可能感兴趣的:(oracle 调用java)