【转】oracle调用外部java程序代码

软件环境:

1、操作系统:win xp

2、数据库:oracle 10.2

3、安装路径:d:\oracle

4、测试class目录:d:\test

前提:如果是使用外部调用java程序的,确保oracle安装目录下的jdk和你编译的jdk版本一致。要不会报找不到class异常的。同时也确保把class文件放至数据库服务器硬盘中。

实现方法:

1、创建一java文件:OraclejavaProc.java

 

1 public class OraclejavaProc {

2     public static void main(String[] args) {

3         System.out.println("It's a oraclejavaproc!");

4     }

5 }

 

2、使用oracle目录下的D:\oracle\product\10.2.0\db_1\jdk\bin javac来编译

    javac OraclejavaProc.java

3、java OraclejavaProc 测试一下是否可成功输出信息。

4、登录oracle (可使用sql*plus或plsql)

 

 1 SQL> conn system/manager

 2 SQL> grant create any directory to scott; --授权

 3 SQL> conn scott/tiger  ---如果是管理员登录操作的可省略此步

 4 SQL> create or replace directory oracle_dir as 'd:\test';

 5 --目录已创建。

 6 SQL> create or replace java class using bfile(oracle_dir,'OraclejavaProc.class');

 7 Java 已创建。

 8 --SQL> select object_name,object_type,STATUS from user_objects; --可查看object_type是否有java class的数据。

 9 SQL> create or replace procedure oracle_java as language java

10 name 'OraclejavaProc.main(java.lang.String[])';

11 --过程已创建。

12 SQL> set serveroutput on size 5000   --使用pl/sql时此句可不用也可打印出

13 SQL> call dbms_java.set_output(5000);

14 --调用完成。

15 SQL> execute oracle_java;

16   It's a oraclejavaproc!

17

18 PL/SQL 过程已成功完成。

19 SQL> call test_java();

20     It's a oraclejavaproc!

21

22 --调用完成。

 



项目里,经常用到oracle里编写 java 类,调用存储过程,于是这篇文档闪亮登场!
具体步骤:

1、登陆某一用户登录,并创建java程序资源,在pl/sql中java source中显示你所编写的java代码;
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;
    }
}

2、创建调用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';

3、建立一过程调用存储过程
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;
/

呵呵,到此为止,基本步骤已经完成,如果你觉得现在可以顺利调用,孩子,醒醒吧,还有权限问题!!
网上抄了下面一段
begin
Dbms_Java.Grant_Permission('new','java.io.FilePermission', '<<ALL FILE>>','read ,write, execute, delete');
Dbms_java.grant_permission('new', 'SYS:java.io.FilePermission', '<<ALL FILES>>','read ,write, execute, delete');
Dbms_Java.Grant_Permission('new', 'java.io.FilePermission', 'd:a.bat','read ,write, execute, delete');
dbms_java.grant_permission('new', 'java.lang.RuntimePermission','*','writeFileDescriptor' );
end;
很神奇,上面一段不行!!不知道为啥……
还是用最简单的方法,用有管理员权限的用户登录pl/sql ,选择users,找到new用户,edit一下,选择Role privileges,加上javasyspriv权限和javauserpriv权限。
OK,到此为止,所有步骤已经完成,可以正常使用了,O(∩_∩)O哈哈~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值