在ORACLE触发器里调用JAVA程序



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

现将过程记录如下:

1。编写JAVA程序

public class Main {
 public static void modify(String statTime)
    {
         String datas = "/var/spool/cron/oracle";
        File data = new File(datas);
        StringBuffer backup = null;
        try {
             StringBuffer content = new StringBuffer();
              backup = new StringBuffer();
            BufferedReader san = new BufferedReader(new FileReader(data));
            String line = null;
            while((line=san.readLine())!=null)
            {
                backup.append(line);
                backup.append("/n");
            }
           content.append("15 ");
           content.append(statTime.trim());
           content.append(" * * * /home/oracle/task.sh");
           content.append("/n");

           content.append("13 ");
           content.append(statTime.trim());
           content.append("* * * /home/oracle/tj_task/task2.sh");
           content.append("/n");
           
           FileWriter writer = new FileWriter(data,false);
            writer.write(content.toString());
            writer.flush();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                try
                {
                    FileWriter writer = new FileWriter(data,false);
                    writer.write(backup.toString());
                    writer.flush();
                }catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
    }
}


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值