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程序,完成了对文件的读写。

     
     
  • 相关阅读:
    vs2015 停 在 update kb2999226 一直不动
    修复vs2012出现 “无法找到包源”的错误
    forward 和redirect的区别
    软件测试分类
    centos7安装HTTPS协议
    php抓取网页特定div区块及图片,从简单入手
    nginx报 File not found 错误
    关于端口
    调试技巧:让断点停在for循环中的 i 为某个值得时候
    an AC a day keeps the WA away ~
  • 原文地址:https://www.cnblogs.com/xinxin1994/p/5990197.html
Copyright © 2011-2022 走看看