导入jar包 
在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 
 1、操作系统需要拥有支持loadjava命令的jdk。 
 2、加载jlha.jar包,到oracle数据库中。 
    操作过程:在dos环境下,输入命令: loadjava   -r   -f   -o   -user   usscares/usscares@usscares   jlha.jar 
注意:jar包要在1.4的环境下编译,项目右键 properties java compiler compoler compliance level 1.4 即可   否则报version 49 类似的错误 

调用JAVA类

oracle调用JAVA类的方法主要有以下三种:

  1. 用loadjava方法装载;

可能是调试方便,据说这种方法比较通用。
c:\test\hello.java

 Java Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

 

public class hello
{

    public static void main(String[] args)
    {
        System.out.println("Hello");
        hello h = new hello();
        h.insertM(9);
    }
    public static void insertM(int pid)
    {
        System.out.println("This is the method insertM.");
    }
}

 C:\test>loadjava -u test/test@mydb -v -resolve hello.java

SQL> create procedure prc_hehe as language java name 'hello.main(java.lang.String[])

过程已创建。

SQL> call prc_hehe();

调用完成。

SQL> set serveroutput on size 2000
SQL> call prc_hehe();

调用完成。

SQL> exec dbms_java.set_output(2000);

PL/SQL 过程已成功完成。

SQL> call prc_hehe();
Hello
This is the method insertM.

调用完成。

SQL>show errors;

修改java类,先删除再装载,方法:

dropjava -u test/test@mydb -v -resolve hello.java

loadjava -u test/test@mydb -v -resolve hello.java

  1. 用sql语句创建

 Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

   

create or replace and compile java source named hehe
AS
public class hello
{
    public static void msg(String name)
    {
        System.out.println("hello," + name);
    }
};
 
create or replace procedure prc_hehe
(
       p_name VARCHAR2
)
as
language java name 'hello.msg(java.lang.String)';

-- 调用结果

SQL> call prc_hehe('oopp');
hello,oopp

  1. 用外部class文件来装载创建

create or replace directory CLASS_DIR  as 'c:\test';

create or replace java class using bfile(class_dir,'hello.class');

create or replace procedure prc_hello
(
       p_name VARCHAR2
)
as
language java name 'hello.msg(java.lang.String)';

-- 测试结果

SQL> call prc_hello('java');
java

可能出现的错误

SQL> call prc_hello('Jerry');
call prc_hello('Jerry')
     *
第 1 行出现错误:
ORA-29516: Aurora 断言失败: Assertion failure at eox.c:359
Uncaught exception System error:   java/lang/UnsupportedClassVersionError

原因:机器装了多个java版本,oracle的java版本低于环境变量设置的版本。

解决方法:用$ORACLE_HOME/jdk/javac 重新编译java文件

核对java已经导入数据库

select * from user_source where type LIKE 'JAVA%' AND NAME = '<java file>'

建立function

CREATE OR REPLACE FUNCTION <FUNCTION_NAME> (<PARAMETER LIST IN ORACLE DATATYPE>) RETURN <ORACLE DATATYPE OF RETURN VARIABLE> AS
   LANGUAGE JAVA
   NAME '<clase.method>(<parameter list in java datatype>) return java datatype of return variable';

 例:

登陆某一用户登录,并创建java程序资源,在pl/sql中java source中显示你所编写的java代码;
 SQL Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

 

create or replace and compile java source named bb_wx_replosssbk as
import java.sql.*;
import oracle.jdbc.driver.*;

public class bb_wx_replosssbk
{
    /**
    *   社保卡挂失
    */
    public static String callProc(String sSfzh, String sPwd, String sType)
    {
        OracleDriver driver = new OracleDriver();
        Connection connection = null;
        CallableStatement cstmt = null;
        String sRtn = "beg";
        try
        {
            sRtn = " try beg";
            connection = DriverManager.getConnection("jdbc:oracle:thin:user/pwd@127.0.0.1:1521:orcl");
            sRtn = "con";
            cstmt = connection.prepareCall("{call run_replosssbk(?,?,?,?)}");
            sRtn = "invoke";
            cstmt.setString(1, sSfzh);
            cstmt.setString(2, sPwd);
            cstmt.setString(3, sType);
            cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
            sRtn = "set value";
            cstmt.executeUpdate();
            sRtn = "execute";
            sRtn = cstmt.getString(4);
        }
        catch (Exception e)
        {
            sRtn = e.toString();
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (cstmt != null)
                {
                    cstmt.close();
                }
                if (connection != null)
                {
                    connection.close();
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        return sRtn;
    }
}

创建调用Java资源的函数
create or replace function run_bb_wx_replosssbk(
sSfz in varchar2,
sPwd in varchar2,
sType in varchar2
)
return varchar2
as 
language java name 'bb_wx_replosssbk.callProc(java.lang.String,java.lang.String,java.lang.String) return java.lang.String';

建立一过程调用存储过程
create or replace procedure RUN(
sSfz in varchar2,
sPwd in varchar2,
sType in varchar2
sRtn out varchar2
)
as
begin
--sRtn := run_bb_wx_replosssbk(sSfz in varchar2,sPwd in varchar2,sType in varchar2);
Select run_bb_wx_replosssbk(sSfz in varchar2,sPwd in varchar2,sType in varchar2)
Into sRtn from dual;
end;
/

附:

如果需要java存取文件,需要使用dba用户赋权

EXEC Dbms_Java.Grant_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
EXEC dbms_java.grant_permission( 'ONBOARDING', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' );
收回权限的语句如下

EXEC Dbms_Java.revoke_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.revoke_Permission('ONBOARDING', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
EXEC dbms_java.revoke_permission( 'ONBOARDING', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' );

oracle调用JAVA类的方法的更多相关文章

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

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

  2. 如何在Mybatis的xml文件调用java类的方法

    在mybatis的映射xml文件调用java类的方法:使用的是OGNL表达式,表达式格式为:${@prefix@methodName(传递参数名称)} 1.如下代码所示:方法必须为静态方法:以下我只是 ...

  3. C#实现调用Java类中方法

    基本思路: 用C#实现调用Java编写的类中的方法:重点是将Java编写的程序打包成Jar,然后使用开源工具IKVM将其转化成DLL控件,在.NET环境下调用. 分为以下步骤: 1.下载JDK6(注: ...

  4. mybatis调用java类

    在mybatis的映射xml文件调用java类的方法: 使用的是OGNL表达式,表达式格式为:${@prefix@methodName(传递参数名称)} 1.如下代码所示:方法必须为静态方法:以下我只 ...

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

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  6. Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法

    最近在工作中遇到了遇到了一个需求需要将TIPTOP中的数据导出成XML并上传到FTP主机中,但是4GL这方面的文档比较少最终决定使用Oracle调用Java的方法,在使用的过程中发现有很多的坑,大部分 ...

  7. java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊

    java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...

  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. 如何设计一门语言(七)——闭包、lambda和interface

    人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...

  2. 单选按钮加confirm进行判断返回false任被选中问题

    <html> <head> <script language="javascript"> var checkValue = "&quo ...

  3. C# 根据类型名称 生成实体 调用方法

    System.Reflection.Assembly ass = System.Reflection.Assembly.Load("项目名称或者DLL"); //System.Th ...

  4. 【WPF】运用MEF实现窗口的动态扩展

    若干年前,老周写了几篇有关MEF的烂文,简单地说,MEF是一种动态扩展技术,比如可以指定以某个程序集或某个目录为搜索范围,应用程序在运行时会自动搜索符合条件的类型,并自动完成导入,这样做的好处是,主程 ...

  5. Android混合开发之WebView使用总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...

  6. ASP.NET Web API 配置 JSONP

    之前的一篇博文:jsonp跨域+ashx(示例) 1. 安装 Jsonp 程序集: PM> Install-Package WebApiContrib.Formatting.Jsonp PM&g ...

  7. 读书笔记--SQL必知必会04--过滤数据

    4.1 使用WHERE子句 在SELECT语句中,数据根据WHERE子句中指定搜索条件进行过滤. 搜索条件(search criteria)也称为(filter condition). WHERE子句 ...

  8. Python(五)模块

    本章内容: 模块介绍 time & datetime random os sys json & picle hashlib XML requests ConfigParser logg ...

  9. 2.C#面向对象基础属性

    属性: 1.一般属性开头字母大写,字段开头字母小写. 2.通过public来赋值的方法无法判断赋值是否非法! 3.无论赋值如何,取值如果就是不采用赋值的结果,那么无论赋值什么都不管用. 4.经典错误之 ...

  10. MVC5学习系列--Razor视图(一)

    前言 嗷~小弟我又出现了~咳咳..嚎过头了, 先说一说为什么写这个吧,~首先肯定是我自己需要学(废话 - -,)//,之前也写过MVC4的项目,嗯..但是仅限于使用并没有很深入的每个模块去了解, 这段 ...