一、首先最好设置环境变量 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')
前面加上 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中