oracle触发器调用java_Oracle触发器反向调用Java程序

导入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 level1.4 即可 否则报version 49类似的错误

调用JAVA类

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

用loadjava方法装载;

可能是调试方便,据说这种方法比较通用。

c:\test\hello.javapublic classhello

{public static voidmain(String[] args)

{

System.out.println("Hello");

hello h= newhello();

h.insertM(9);

}public static void insertM(intpid)

{

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 2000SQL>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

用sql语句创建

create or replace and compile java source named hehe

ASpublic classhello

{public static voidmsg(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

用外部class文件来装载创建

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

create or replace javaclass 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:359Uncaught 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 = ''建立function

CREATE OR REPLACE FUNCTION () RETURN AS

LANGUAGE JAVA

NAME'() return java datatype of return variable';

例:

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

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

{/*** 社保卡挂失*/

public staticString callProc(String sSfzh, String sPwd, String sType)

{

OracleDriver driver= newOracleDriver();

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();

}

}returnsRtn;

}

}

创建调用Java资源的函数

create or replace function run_bb_wx_replosssbk(

sSfz in varchar2,

sPwd in varchar2,

sType in varchar2

)returnvarchar2

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', '<>', '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', '<>', 'execute' );

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值