最近在工作中遇到了遇到了一个需求需要将TIPTOP中的数据导出成XML并上传到FTP主机中,但是4GL这方面的文档比较少最终决定使用Oracle调用Java的方法,在使用的过程中发现有很多的坑,大部分的博客只粗略的介绍了下导致耗费了很多时间,在这里分2个博文详细的记录一下这个功能,填一下坑,希望可以帮助到大家。

首先 每个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';

执行脚本时间比较长要耐心等待一会,安装完成后需要根据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方法若需要用到其他价包,报找不到类的错或要用到数据库中的数据 将在下一个博客中说到)

create or replace and compile java source named JavaName as [Java代码]

当使用这种方法的时候可以在PL/SQL 左边的Java Sources 文件夹中找得到源码并编辑,如果导入的是.Java或.Jar格式的就只能在Java Classes 文件夹中找得到并且不能用PL/SQL编辑.

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

SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE, STATUS
FROM USER_OBJECTS
WHERE OBJECT_TYPE LIKE 'JAVA%'

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

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

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

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

本文主要介绍了如何导入和如何封装Java方法,如果你的业务逻辑比较复杂需要用到第三方jar包来实现自己的业务逻辑那么这些坑将在下一篇中说到。

Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法的更多相关文章

  1. Oracle调用Java方法(下)复杂Jar包封装成Oracle方法以及ORA-29521错误

    上一篇随笔中已经说了简单的Jar是如何封装的,但是我的需求是根据TIPTOP的查询条件产生XML文件并上传到FTP主机中,那么就要涉及到XML生成的方法和FTP上传的方法 所以在Eclipse写的时候 ...

  2. oracle调用JAVA类的方法

    导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了,  1.操作系统需要拥有支持loadjava命令的jdk.  2.加 ...

  3. Oracle调用Java类开发的存储过程、函数的方法

    oracle调用java类的基本步骤 1. 编写java代码,后续可以直接使用java代码,class文件或者jar包 2. 将写好的java代码导入到oracle数据库中,有两种方法:一种是使用lo ...

  4. java 执行 jar 包中的 main 方法

    java 执行 jar 包中的 main 方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多 ...

  5. Gradle 使用本地的Jar包(gradle oracle ojdbc14 )

    Gradle 使用本地的Jar包(gradle oracle ojdbc14 ) 因为Oracle的驱动包在Maven上是没办法直接下载到的,所以在使用Gradle的使用,会导致无法加载Oracle, ...

  6. (转载) android studio library生成jar包和aar的方法总结

    android studio library生成jar包和aar的方法总结 标签: android学习文档jar和aar的使用与生成gradle 2016-11-25 10:39 1782人阅读 评论 ...

  7. Java Service Wrapper将jar包安装成Windows服务

    刚接触java,第一次使用Java开发windows服务,也是刚不久看了SSM框架 简直也是一头雾水,不过只要用心理解,其实很简单,下面有详细的步骤,包学包会 在windows上运行jar包,需要在工 ...

  8. 在国内使用maven下载jar包非常慢的解决方法

    在国内使用maven下载jar包非常慢的解决方法 1.原因: 很多jar包在国外环境,所以会很慢. 2.解决方法 maven支持镜像环境下载,所以首先找到maven的conf目录中的settings. ...

  9. Jmeter引用外部jar包的几种方法

    总结记录下jmeter引用外部jar包的3种方法及其优缺点: 一.测试计划中添加目录或jar包到Classpath 操作:测试计划->添加目录或jar包到Classpath-->浏览导入j ...

随机推荐

  1. P2812 校园网络

    luogu 传送门 首先考虑问题一 不难想到,如果有一个学校作为终端机,那么跟其处于同一个强联通中的所有学校就可以不用作为终端机了. 那么,问题一也就迎刃而解了:找到所有入度为0的缩点.因为这个学校( ...

  2. 同步锁Lock & 生产者和消费者案例

    显示锁 Lock ①在 Java 5.0 之前,协调共享对象的访问时可以使用的机 制只有 synchronized 和 volatile . Java 5.0 后增加了一些 新的机制,但并不是一种替代 ...

  3. DQN(Deep Q-learning)入门教程(四)之Q-learning Play Flappy Bird

    在上一篇博客中,我们详细的对Q-learning的算法流程进行了介绍.同时我们使用了\(\epsilon-贪婪法\)防止陷入局部最优. 那么我们可以想一下,最后我们得到的结果是什么样的呢?因为我们考虑 ...

  4. 一文让你快速上手 Mockito 单元测试框架

    前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...

  5. Rocket - regmapper - RegisterCrossing

    https://mp.weixin.qq.com/s/82iLT-fmDg9Comp2p9bxKg 简单介绍RegisterCrossing的实现. 1. BusyRegisterCrossing 简 ...

  6. Chisel3 - Tutorial - Parity

    https://mp.weixin.qq.com/s/OtiQnE52PwdCpvmzJ6VFnA   奇偶发生器.统计输入中1的个数,如果为偶数则输出0,奇数则输出1.   参考链接: https: ...

  7. 一个request请求然后锁定等待异步接口处理结果

    private ConcurrentHashMap<String, Locker> relation = new ConcurrentHashMap<String, Locker&g ...

  8. golang内存逃逸

    golang程序变量会携带油一组校验数据,用来证明它的整个生命周期是否在运行时完全可知.如果变量通过了这些校验,它就可以在栈上分配.否则就说它逃逸了,必须在堆上分配     能引起变量逃逸到堆上的典型 ...

  9. Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)

    小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...

  10. Java实现 蓝桥杯 算法提高 三进制数位和

    算法提高 三进制数位和 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 给定L和R,你需要对于每一个6位三进制数(允许前导零),计算其每一个数位上的数字和,设其在十进制下为S. 一个 ...