在ORACLE触发器里调用JAVA程序

因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据。

现将过程记录如下:

1。编写JAVA程序

[java] view plain copy
 
  1. public class Main {  
  2.  public static void modify(String statTime)  
  3.     {  
  4.          String datas = "/var/spool/cron/oracle";  
  5.         File data = new File(datas);  
  6.         StringBuffer backup = null;  
  7.         try {  
  8.              StringBuffer content = new StringBuffer();  
  9.               backup = new StringBuffer();  
  10.             BufferedReader san = new BufferedReader(new FileReader(data));  
  11.             String line = null;  
  12.             while((line=san.readLine())!=null)  
  13.             {  
  14.                 backup.append(line);  
  15.                 backup.append("/n");  
  16.             }  
  17.            content.append("15 ");  
  18.            content.append(statTime.trim());  
  19.            content.append(" * * * /home/oracle/task.sh");  
  20.            content.append("/n");  
  21.   
  22.            content.append("13 ");  
  23.            content.append(statTime.trim());  
  24.            content.append("* * * /home/oracle/tj_task/task2.sh");  
  25.            content.append("/n");  
  26.              
  27.            FileWriter writer = new FileWriter(data,false);  
  28.             writer.write(content.toString());  
  29.             writer.flush();  
  30.   
  31.             } catch (FileNotFoundException e) {  
  32.                 e.printStackTrace();  
  33.             } catch (IOException e) {  
  34.                 try  
  35.                 {  
  36.                     FileWriter writer = new FileWriter(data,false);  
  37.                     writer.write(backup.toString());  
  38.                     writer.flush();  
  39.                 }catch(Exception ex)  
  40.                 {  
  41.                     ex.printStackTrace();  
  42.                 }  
  43.             }  
  44.     }  
  45. }  

注意,这里写JAVA程序不需要遵循标准的JAVA程序,一定要有main入口函数,相反,这里的函数一般不要取名为main,除非格式是标准的main 函数格式,刚开始的时候我就犯了这个错误,一直找不到原因,后来经CSDN上的人点拨后,才发现是我把上面函数名写成了main,后来换个名字就好了。还有,这个函数一定是要静态的。

2。把JAVA程序LOAD进oracle

在$ORACLE_HOME/bin目录下有个LOADJAVA命令,使用这个命令将刚写好的JAVA程序LOAD进数据库

loadjava -user test/test@test -o -v -f -r Main.java

如果成功的话,会打印出来信息提示成功,若程序有编译错误的话,也会提示你错误的地方。

3。修改权限

因为我的这个JAVA程序里涉及到对文件的读写操作,所以要先修改权限。

首先以管理员身份登录进数据库

sqlplus / as sysdba

然后执行

begin

dbms_java.grant_permission('TEST','SYS:java.io.FilePermission','/var/spool/cron/oracle','read,write,execute,delete');

end;

/

执行完毕后,在数据库里执行上述JAVA程序时,就拥有读写该文件的权限了。

4。创建存储过程

进入到数据库,我是在SQLPLUS命令行

create or replace procedure Modify(name varchar2) as language Java name 'Main.modify(java.lang.String)';

/

会提示创建存储过程成功。

5。增加trigger

我是在TOAD里直接针对某个表增加trigger,所以我只写出关键部分的代码

begin

if :old.name = 'time' then

Modify(:new.value);

end if;

end;

至此,在ORACLE的trigger里调用JAVA程序就完成了,后来的实验证明,每当更新这个表时,都确实执行了该JAVA程序,完成了对文件的读写。

 
 
原文地址:https://www.cnblogs.com/xinxin1994/p/5990197.html