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

时间:2014年12月24日  浏览:5538次

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命令及其用法,loadjava命令有很多的参数,也没有必要全部都了解,loadjava的调用规则如下图1所示:

图1:loadjava的调用规则

loadjava命令不是在sql*plus中调用的,而是在cmd窗口中,有关loadJava的各个参数的意思,可以使用:loadjava -help 命令来获得详细帮助。本文中主要用到的参数有-u(用于输入用户名及密码)、-v(用于输出详细的反馈信息)、-resolve(对于没有编译的Java文件,可以用resolve来编译)、-f(这个命令我在例子中没有用到,它的意思是force,表示不管之前是否已经导入过该Java类,都强制再次导入)。loadjava可以实现对class文件、jar文件、resource文件、property文件的导入,当导入class文件时,可以用如下命令:

loadjava –u username/userpassword –v filename.class

当导入Java文件时,可以用如下命令:

loadjava –u username/userpassword –v -resolve filename.java

当导入jar文件时,可以用如下命令:

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中开发好的代码。

// 圆工具类,计算圆的面积
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命令行中进入该目录下,然后执行如下命令:

loadjava –u username/userpassword –v -resolve CircleTools.java

执行上面的命令就OK了,下面提供另一种方法,就是直接在PL/SQL中写,写法如下:

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所示:

图2:user_objects表中查询到CircleTools类

Step 3:编写存储过程(procedure)或者函数(function)来封装,以实现以后的调用,一般来说,如果一个Java方法没有返回值,那么就封装成存储过程,如果有返回值,就封装成函数,这里我只给出一个封装成函数的例子:

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所示:

图3:测试calc_square函数

Step 5:如果不想用那个Java类了,可以用dropjava命令删除掉系统中的Java,这个跟loadjava很相似,下面截图:

图4:dropjava命令

例如:

dropjava -user username/userpassword@db -v javasourcename

注意上面删除的是Java的source name,不是class name,即对象的OBJECT_TYPE是JAVA SOURCE,不是JAVA CLASS。这个地方我不太确定,不过我直接删除类名是报错了,先这样写着吧,后面发现错了,我会纠正的。

在oracle中调用Java source的思路大概就是上面这样,一想到可以把Java代码跑在oracle中是不是还是蛮激动的,功能一下子就有扩展了许多。

Oracle数据库中调用Java类开发存储过程、函数的方法的更多相关文章

  1. kettle中调用java类

    kettle中调用java类 有时须要在kettle调用java类,如:验证.查询或自己定义加密等.有时甚至连主要的数据訪问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应 ...

  2. Js文件函数中调用另一个Js文件函数的方法

    在项目中Js文件需要完成某一功能,但这一功能的大部分代码在另外一个Js文件已经完成,只需要调用这个文件实现功能.那么如何调用:一个Js文件函数中调用另一个Js文件函数的方法? (直接代码说明) 示例d ...

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

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

  4. python_代码中调用java类

    1. 安装jpype (python调用java class文件用) 1.1. 自动安装:pip install jpype1 1.2. 手动方式安装jpype1 安装wheel:pip instal ...

  5. oracle调用JAVA类的方法

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

  6. Thymeleaf常用语法:模板文件中表达式调用Java类的静态方法

    在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1. ...

  7. oracle数据库中的存储过程

    存储过程是一组为了完成特定功能的sql语句集,是一段sql代码片段,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果存储过程存在参就给出,不存在就不用给出参数)来执行它.因为它是一段 ...

  8. thymeleaf模板引擎调用java类中的方法(附源码)

    前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...

  9. Jsp中如何通过Jsp调用Java类中的方法

    Jsp中如何通过Jsp调用Java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:cn.tianaoweb.com; 2.再在包中添加一个类:如 package com; public ...

随机推荐

  1. 表单事件onsubmit与onreset

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. jquery常用代码

    转自:未找到 以下是jquery中比较常用的一些操作实现方式: $("标签名") //取html元素 document.getElementsByTagName("&qu ...

  3. HTTP04--CDN知识

    一.CDN用途及概念 目的: CDN是内容分布网路(Content Delivery Network)的简称,目的是将网站内容发布到最接近用户的边缘,使用户就近获取内容,提高相应速度. 使用机制: 目 ...

  4. 写Java也得了解CPU--CPU缓存

    CPU,一般认为写C/C++的才需要了解,写高级语言的(Java/C#/pathon...)并不需要了解那么底层的东西.我一开始也是这么想的,但直到碰到LMAX的Disruptor,以及马丁的博文,才 ...

  5. FineUI v3.3.1 发布了!

    关于FineUI基于 ExtJS 的专业 ASP.NET 控件库. FineUI的使命创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No We ...

  6. Java 生成 UUID

    1.UUID 简介 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Found ...

  7. 你误解 .net 了吗?

    我现在发现很多人对C#还存在很大的误解,例如C#是完全封闭的,C#不能跨平台,C#性能很差,C#不支持指针等等,持以上观点的人非常多,甚至最近看到的国内某机构对开发语言的统计中还写着C#不跨平台,不开 ...

  8. Windows Phone 8 下载文件进度

    后台代码: public partial class MainPage : PhoneApplicationPage { private long siz; private long speed; p ...

  9. 数据库系统原理——ER模型与关系模型

    原文链接: http://blog.csdn.net/haovip123/article/details/21614887 犹记得第一次看<数据库系统原理>时看天书的感觉,云里雾里:现在已 ...

  10. rhel7修改网卡命名规则

    1步:当安装完红帽RHEL7系统安装完成,您的网卡命名是这样的. 第2步:请编辑网卡的配置文件 将”/etc/sysconfig/network-scripts/ifcfg-eno16777736“的 ...