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 ...
随机推荐
- Oracle取TOP N条记录(转载)
在SQL Server里面有top关键字可以很方便的取出前N条记录,但是Oracle里面却没有top的使用,类似实现取出前N条记录的简单方法如下: 方法1:利用ROW_NUMBER函数 取出前5条记录 ...
- oracle存储过程中的if...elseif...else用法
if ... then ... elsif ... then ... else ... end if; or if ... then ... else ... end ...
- css3动画中的steps值详解
css3的动画的animation-timing-function属性定义了动画的速度曲线,一般的速度曲线大家都知道,什么ease,linear,ease-in,ease-out,还有自定义贝塞尔曲线 ...
- Centos 检查磁盘读写性能
启动Tomcat发现deploy war的速度明显变慢, 怀疑磁盘出问题 测试写入 [tomcat@localhost ~]$ dd if=/dev/zero of=kwxgd bs=64k coun ...
- Java集合系列:-----------03ArrayList源码分析
上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayLi ...
- BZOJ 1082 【SCOI2005】 栅栏
Description 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些木 ...
- weblogic.nodemanager.common.ConfigException: Native version is enabled but nodemanager native library could not be loaded 解决办法
近日在一个原本工作正常的weblogic web server(操作系统为redhat 64位系统)上折腾安装redis/hadoop等东东,yum install了一堆第3方类库后,重启weblog ...
- 虾皮工作室QQ群列表
各位博友: 本群不仅仅是提供好的资料,更重要是提供平台,提供解决问题的方法和思路.求人不如求己,掌握合理的方法和方式才是不断进步的根本.看我的文档,不单单是看内容,更应该从整理的方式和角度是深思,去想 ...
- 在线音乐网站【04】Part two 功能实现
上一篇博客里面已近总结了三个功能的具体实现,今天把剩余功能的具体实现补充总结,如果你想对整个小项目有清楚的了解,建议去看下前几篇博客. 1.在线音乐网站(1)需求和功能结构 2.在线音乐网站(2 ...
- (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...