zoukankan      html  css  js  c++  java
  • 在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程序,完成了对文件的读写。

     
     
  • 相关阅读:
    第十二章学习笔记
    UVa OJ 107 The Cat in the Hat (戴帽子的猫)
    UVa OJ 123 Searching Quickly (快速查找)
    UVa OJ 119 Greedy Gift Givers (贪婪的送礼者)
    UVa OJ 113 Power of Cryptography (密文的乘方)
    UVa OJ 112 Tree Summing (树的求和)
    UVa OJ 641 Do the Untwist (解密工作)
    UVa OJ 105 The Skyline Problem (地平线问题)
    UVa OJ 100 The 3n + 1 problem (3n + 1问题)
    UVa OJ 121 Pipe Fitters (装管子)
  • 原文地址:https://www.cnblogs.com/xinxin1994/p/5990197.html
Copyright © 2011-2022 走看看