最近在工作中遇到了遇到了一个需求需要将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. HomeLede 2020.5.27更新 UPnP+NAS+多拨+网盘+DNS优化+帕斯沃/Clash 无缝集成+软件包

    交流群:QQ 1030484865 电报 t.me/t_homelede   固件说明 基于Lede OpenWrt R2020.5.20版本(源码截止2020.5.27)及若干自行维护的软件包 结合 ...

  2. 【C++】赋值过程中类型转换

    注意:以下内容摘自文献[1],修改了部分内容. 1.赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时自动进行类型转换. (1) 将浮点型数据(包括单.双精度)赋给 ...

  3. 【转】动态规划:最长递增子序列Longest Increasing Subsequence

    转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...

  4. unix 密码破解,zip破解总结

    unix /etc/passwd 破解,假设的前两位是salt import crypt #数据比较 def password_crak(pass_word): salt = pass_word[0: ...

  5. ms-setting是什么

    ms-settings 遇到了两个问题,记录一下 1)windows桌面右键菜单-->显示设置或者个性化-->报错:ms-settings:personalization-backgrou ...

  6. 数据库之 MySQL --- 数据处理 之 表的约束与分页(七)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有)     1.约束 :为了保证数据的一致性和完整性,SQL规范以约束的方式对表数据进行额外的条件限制 ​ ...

  7. Java实现 LeetCode 809 情感丰富的文字 (暴力)

    809. 情感丰富的文字 有时候人们会用重复写一些字母来表示额外的感受,比如 "hello" -> "heeellooo", "hi" ...

  8. Java 第十一届 蓝桥杯 省模拟赛 合法括号序列

    合法括号序列 题目 问题描述 由1对括号,可以组成一种合法括号序列:(). 由2对括号,可以组成两种合法括号序列:()().(()). 由4对括号组成的合法括号序列一共有多少种? 答案提交 这是一道结 ...

  9. Java实现 蓝桥杯 算法提高金属采集

    问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共有 n 个节点,这些节点被编号为 1~n .人类将 ...

  10. ant构建Jmeter脚本的build文件配置(build.xml)

    使用此构建文件可自动发送邮件  代码如下: <?xml version="1.0" encoding="UTF8"?> <project na ...