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

Posted Bruce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle调用Java类开发的存储过程函数的方法相关的知识,希望对你有一定的参考价值。

oracle调用java类的基本步骤

1. 编写java代码,后续可以直接使用java代码,class文件或者jar包

2. 将写好的java代码导入到oracle数据库中,有两种方法:一种是使用loadjava命令;另一种是在编写PL/SQL的时候编写

3. 编写存储过程、函数 来封装java代码,以实现后面对java功能的调用

4. 调用写好的存储过程和oracle函数


loadjava命令介绍

有关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


实例:使用oracle调用java全步骤

下面一个类是对32位MD5扩展为64位MD5的算法类,我们将在java函数中调用这个类中的方法实现对32位

MD5算法的扩展

步骤一:编写java代码:(注意参数写完整类名)

//create or replace and compile java source named mac32tomac64 as

public class Mac32ToMac64 {

    public static byte[] hex2byte(java.lang.String hex)

            throws Exception {

        if (hex.length() % 2 != 0) {

            throw new Exception();

        }

        char[] arr = hex.toCharArray();

        byte[] b = new byte[hex.length() / 2];

        for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {

            java.lang.String swap = "" + arr[i++] + arr[i];

            int byteint = java.lang.Integer.parseInt(swap, 16) & 0xFF;

            b[j] = new java.lang.Integer(byteint).byteValue();

        }

        return b;

    }

    public static java.lang.String byte2hex(byte[] b) {

        java.lang.StringBuffer hs = new java.lang.StringBuffer();

        java.lang.String stmp;

        for (int i = 0; i < b.length; i++) {

            stmp = java.lang.Integer.toHexString(b[i] & 0xFF).toUpperCase();

            if (stmp.length() == 1) {

                hs.append("0").append(stmp);

            } else {

                hs.append(stmp);

            }

        }

        return hs.toString();

    }

    public static byte[] lengthen(byte[] byteArray) {

        byte[] result = new byte[byteArray.length * 2];

        for (int i = 0; i < byteArray.length; i++) {

            result[2 * i] = byteArray[i];

            int value = (byteArray[i] + byteArray[i == byteArray.length - 1 ? 0 : i + 1]) & 0xFF;

            result[2 * i + 1] = new java.lang.Integer(value).byteValue();

        }

        return result;

    }

    public static java.lang.String to64Mac(java.lang.String req32Mac)

            throws Exception {

        byte[] bytes = hex2byte(req32Mac);

        if (bytes.length == 16) {

            return byte2hex(lengthen(bytes));

        } else {

            throw new Exception("");

        }

    }

}

步骤二:使用loadjava命令将java导入到orale数据库中,键入密码后就会有导入信息了

loadjava –u username –v -resolve Mac32ToMac64 .java
亦可以通过以下语句验证是否导入成功

select * from user_objects u where u.OBJECT_NAME=\'Mac32ToMac64\'


步骤三:编写存储过程或者函数,以实现以后的调用,如果一个Java方法没有返回值,那么就封装成存储过程,如果有返回值,就封装成函数,这里是封装成函数的例子,存储过程类似,不再敖述。这里varchar对应的java String类型必须写完整类名,否则会报错

CREATE OR REPLACE FUNCTION to64mac(r IN VARCHAR2) RETURN VARCHAR2 AS


  LANGUAGE JAVA NAME \'Mac32ToMac64.to64Mac(java.lang.String) return String\';

可以在PL/SQL中直接测试结果

clipboard

以上是关于Oracle调用Java类开发的存储过程函数的方法的主要内容,如果未能解决你的问题,请参考以下文章

JAVA调用Oracle存储过程和函数

java调用oracle存储过程 关于sql里面in函数参数的问题

如何在ORACLE存储过程中调用WEBSERVICE函数

java调用Oracle中的存储过程与存储函数

Java代码调用存储过程和存储方法

java中如何获取oracle存储过程返回的多个值。