oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL,除此之外,还可以用时下最流行的编程语言Java来做开发。随着对 oracle 的了解越来越多,越来越禁不住 oracle 的诱惑,oracle 技术真的是一门很有趣的学问。之前,我在博客中总结了挺多有关 SQL、PL/SQL 的,但是对于 oracle 数据库中 Java 类的调用却没有总结,也是因为之前不太会,这会儿总结了一下,特来分享。
1、oracle 中调用 Java 类的基本思路
要在 oracle 中调用 Java 类来实现存储过程、函数,我觉的大概的思路是这样的:
(1)首先编写 Java 代码,可以用自己喜欢的代码编辑器编辑,编辑好了以后,可以将代码编译成.class 文件,也可以打成 jar 包,也可以啥都不操作,就是一个 Java 源代码文件在那放着。
(2)想办法将已经写好的 Java 代码导入到 oracle 数据库中,这里导入主要有两种方法,一种是使用 loadjava 命令,另一种是直接在编写 PL/SQL 代码的时候写 Java 代码,这两种方法我在下面会详细总结。
(3)编写存储过程、函数来封装 Java 代码,以实现后面对 Java 功能的调用。
(4)准备工作已经做完了,最后就是调用了,调用的方式与 PL/SQL 完全一样,没啥不同的。
2、loadjava 命令介绍
loadjava 命令不是在 sql*plus 中调用的,而是在 cmd 窗口中,有关 loadJava 的各个参数的意思,可以使用:loadjava -help 命令来获得详细帮助。本文中主要用到的参数有-u(用于输入用户名及密码)、-v(用于输出详细的反馈信息)、-resolve(对于没有编译的 Java 文件,可以用 resolve 来编译)、-f(这个命令我在例子中没有用到,它的意思是 force,表示不管之前是否已经导入过该 Java 类,都强制再次导入)。loadjava 可以实现对 class 文件、jar 文件、resource 文件、property 文件的导入,当导入 class 文件时,可以用如下命令:
1 | loadjava –u username/userpassword –v filename.class |
当导入 Java 文件时,可以用如下命令:
1 | loadjava –u username/userpassword –v -resolve filename.java |
当导入 jar 文件时,可以用如下命令:
1 | loadjava –u username/userpassword –v -resolve filename.jar |
3、举例说明 oracle 调用 Java 全步骤
例子:一个简单的需求,用 Java 代码实现求圆的面积,圆周率 PI 为 3.14,输入的参数为圆的半径 R,输出圆的面积 S,要求可以在 oracle 中用 PL/SQL 代码调用该 Java 类实现求圆的面积的功能。
Step 1:编写 Java 代码,PL/SQL Developer 本身虽然支持编写 Java 代码,但是毕竟不是专业的,对 Java 的工具提供的不是特别好,我喜欢用 MyEclipse 开发好以后复制过来,下面是我在 MyEclipse 中开发好的代码。
1 2 3 4 5 6 7 8 9 10 | // 圆工具类,计算圆的面积 public class CircleTools { // 定义常量 PI public static final double PI = 3.14 ; // 计算面积 public static double calcSquare( double r) { return PI * r * r; } } |
注意在写 Java 代码的时候,为了能够直接能够在 oracle 中被调用,所以这里在需要调用的方法前要加上 public 和 static。
Step 2:写好 Java 代码,下面就是要将 Java 导入到 oracle 数据库中,导入的方法在前文提到过可以用 loadJava 或者直接写。如果要用 loadJava 导入,先把上面的代码文件保存为 CircleTools.java,然后在 cmd 命令行中进入该目录下,然后执行如下命令:
1 | loadjava –u username/userpassword –v -resolve CircleTools.java |
执行上面的命令就 OK 了,下面提供另一种方法,就是直接在 PL/SQL 中写,写法如下:
1 2 3 4 5 6 7 8 9 10 | CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED circletools AS // 圆工具类,计算圆的面积 public class CircleTools { // 定义常量 PI public static final double PI = 3.14; // 计算面积 public static double calcSquare( double r) { return PI * r * r; } } |
我的 oracle 开发工具是 PL/SQL Developer,所以我在 PL/SQL Developer 中执行了上面这段代码,然后查询 user_objects 表,可以发现 CircleTools 类已经被导入进了 oracle 数据库中
图 2:user_objects 表中查询到 CircleTools 类
Step 3:编写存储过程(procedure)或者函数(function)来封装,以实现以后的调用,一般来说,如果一个 Java 方法没有返回值,那么就封装成存储过程,如果有返回值,就封装成函数,这里我只给出一个封装成函数的例子:
1 2 | CREATE OR REPLACE FUNCTION calc_square(r IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'CircleTools.calcSquare(double) return double' ; |
Step 4:上面几步基本上已经实现了全部了,最后一步测试一下,我 test 了一下 calc_square 这个函数
图 3:测试 calc_square 函数
Step 5:如果不想用那个 Java 类了,可以用 dropjava 命令删除掉系统中的 Java,这个跟 loadjava 很相似
图 4:dropjava 命令
例如:
1 | dropjava -user username/userpassword@db -v javasourcename |
注意上面删除的是 Java 的 source name,不是 class name,即对象的 OBJECT_TYPE 是 JAVA SOURCE,不是 JAVA CLASS。这个地方我不太确定,不过我直接删除类名是报错了,先这样写着吧,后面发现错了,我会纠正的。
在 oracle 中调用 Java source 的思路大概就是上面这样,一想到可以把 Java 代码跑在 oracle 中是不是还是蛮激动的,功能一下子就有扩展了许多。