• -------------------------------------------------------------
  • ====================================

Oracle数据库中调用Java类开发存储过程、函数的方法

编程语言 dewbay 8年前 (2017-05-18) 2326次浏览 已收录 0个评论 扫描二维码

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 中是不是还是蛮激动的,功能一下子就有扩展了许多。


露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Oracle数据库中调用Java类开发存储过程、函数的方法
喜欢 (1)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址