mysql oracle导入jar包_Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法...

本文详细记录了在Oracle 11g中使用LoadJava命令导入和管理Java类、Jar包的过程,以及如何将Java方法封装为Oracle的函数和存储过程。内容包括OJVM的安装、Java类的导入与删除、Java方法的公共静态要求,以及封装过程中遇到的坑和解决方案。
摘要由CSDN通过智能技术生成

最近在工作中遇到了遇到了一个需求需要将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';

960f57e7b210485a90fceaf946143eab.png

执行脚本时间比较长要耐心等待一会,安装完成后需要根据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编辑.

bc225c8298b3c8a276ec46f24b3419eb.png

如果导入正常的话使用下面的语句可以查询当前用户已经导入的Java类,查询出来的状态必须是"VALID",否则Oracle则不能调用必须解决报错信息重新导入才能调用

SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE, STATUS

FROM USER_OBJECTS

WHERE OBJECT_TYPE LIKE 'JAVA%'

8bb7d882d69b2948b81e2a67919c6d99.png

以上代码都执行完成后就可以将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 官方的文档

4f51a60ca07d3038328dbe5654154dc2.png

那如果需要传入的是一大堆表数据呢? 其实这种类型对应并不支持复杂的类型,要想获得复杂数据 需要在Jar包中加入JDBC包使用JDBC来建立查询语句来获取数据 获取JDBC的Connection对象的时候可以可以这样写,不用写数据库链接名和账号密码,可以直接使用数据库的连接。

Connection conn = DriverManager.getConnection("jdbc:default:connection:");

详情也可以参照Oracle官方文档中的这一单元:Using the Server-Side Internal JDBC Driver

aab91448b6057324690bbe851da6b916.png

本文主要介绍了如何导入和如何封装Java方法,如果你的业务逻辑比较复杂需要用到第三方jar包来实现自己的业务逻辑,或者发生了ORA-29521: referenced name java/xxx/xxx/xxx could not be found错误那么这些问题将在下一篇中说到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值