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 level 1.4 即可 否则报version 49 类似的错误
调用JAVA类
oracle调用JAVA类的方法主要有以下三种: 用loadjava方法装载;
可能是调试方便,据说这种方法比较通用。
c:\test\hello.java
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 用sql语句创建
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 用外部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代码;
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程序的更多相关文章
- 在ORACLE触发器里调用JAVA程序
因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 publ ...
- C通过JNI反向调用JAVA程序方法
JNI反向调用JAVA程序 引述:上文讲过java线程---OS线程的关系,然后C怎样反向调用JAVA程序方法是我们这篇讲的重点 1.ThreadTest中添加run()方法 2.编译ThreadTe ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- C#调用java程序
前言: 最近跟项目组的人合作一个项目,由于之前我用的是java写的一个与android通信的程序,现在另一个同事来编写界面程序,由于C#编写起来比较方便,而我又不想重新写之前java的那段代码,于是需 ...
- LoadRunner调用Java程序—性能测试-转载
LoadRunner调用Java程序—性能测试 为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunn ...
- oracle触发器调用java程序
1.创建java程序:接收存储过程传递的参数,发送socket通信. create or replace and compilejava source named jym as import java ...
- oracle PL/SQL调用Java生成Excel
现在有个需求, 要求编写oracle存储过程生成Excel文件到指定目录, 但是oracle自己的API貌似不太给力, 所以只能通过另一种更强大的语言来实现了 ——Java.有一个Java框架 ...
- LoadRunner调用Java程序—性能测试
为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunner如何调用Java测试代码,完成压力测试. 通常我 ...
- python调用java程序--jpype
官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html ...
随机推荐
- iOS ARC内存管理
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
- Window 对象
Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(<frame> 或 <iframe> 标签),浏览器会为 HTML 文档创建一个 window ...
- django复习笔记1:环境配置
一.IDE 推荐使用sublime安装djaneiro插件. 1.安装方式 package control中搜索djaneiro 支持补全请参考:Django support for Sublime ...
- 处理OSX创建的U盘, 删除EFI分区
1. 运行 diskpart 2. list disk 3. 根据列出的硬盘, select disk [编号] 4. clean 5. exit 然后再创建分区和格式化
- mediaplayer与surfaceView,无法播放问题
mediaplayer需要在surfaceView创建之后才能创建,不然会导致错误. surfaceholder = msurface.getHolder(); surfaceholder.setKe ...
- 为什么Javascript中的基本类型能调用方法?
我们从一道笔试题说起: var str = 'string'; str.pro = 'hello'; console.log(str.pro + 'world'); 输出啥?要理解这个问题,我们得从头 ...
- 解决Package illuminate/html is abandoned, you should avoid using it. Use laravelcollective/html instead.问题
解决步骤: 1.分析问题是因为laravel5.1不赞成使用illuminate/html而推荐使用laravelcollective/html包,所以我们利用composer命令移除illumina ...
- js异步状态监控
说明:写这篇文章,是希望被吐槽的. 一.背景 在做报表页面的时候,页面上有很多的异步加载,而设计的loading是个全局的,一个页面就有一个. 控制loading什么时候出现,什么时候消失,要实时的知 ...
- HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子
前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...
- SQLite剖析之C/C++接口
前言 SQLite3是SQLite一个全新的版本,它虽然是在SQLite2的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API.SQLite3是为了满足以下的需求而开发的:支持UTF ...