oracle觸發器調用java程序


1、創建java程序:接收存儲過程傳遞的參數,發送socket通信。  
create or replace and compilejava source named jym as
import java.io.BufferedReader;
import java.io.InputStream;
importjava.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
importjava.net.InetSocketAddress;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
importjava.sql.PreparedStatement;
import java.sql.Statement;
public class JYM {
public static  StringsendSynMsg(String ipAddr, byte[] datas) throws Exception{
  InetSocketAddress endpoint = new InetSocketAddress(ipAddr ,18002);
  Socket socket = null;
  OutputStream out = null;
  InputStream in = null;
  try {
   socket = new Socket();
   socket.connect(endpoint);
   out = socket.getOutputStream();
   in = socket.getInputStream();
   out.write(datas);
   out.flush();
   return null;
  } finally {
   if (out != null) {
    try {
     out.close();
    } catch(Exception ex) {
     ex.printStackTrace();
    }
   }
   if (in != null) {
    try {
     in.close();
    } catch(Exception ex) {
     ex.printStackTrace();
    }
   }
   if (socket != null) {
    try {
     socket.close();
    } catch(Exception ex) {
     ex.printStackTrace();
    }
   }
  }
}
public static void say(String ip,byte[] context) throws Exception {
  String str=JYM.sendSynMsg(ip,context);  
  Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection conn =DriverManager.getConnection("jdbc:oracle:thin:@192.168.9.109:1521:orcl","zhym","jhhz621"); 
  PreparedStatement pr=conn.prepareStatement("insert intobackdata(context) values(?)");
  pr.setBytes(1, context);
  pr.executeUpdate();
  pr.close();
  conn.close();
}
} 
 2、存儲過程調用java source 
create or replace procedure socket(   
ip varchar2,   
context raw   
)   
as  
language java name  
'JYM.say(java.lang.String,byte[])';  
 3、觸發器調用存儲過程 
create or replace trigger todata_after   
  after insert on todata   
  for each row   
begin   
   socket('192.168.9.12',:new.context);   
end todata_after;   
代碼寫好后可以先用存儲過程測試:
Sql代碼  
call  socket('192.168.9.12','023132');   
 為了能在控制台中看見錯誤信息,要先運行下面3句話  
set serveroutput on;   
set serveroutput on size 5000;   
call dbms_java.set_output(5000);  
假如你運行存儲過程時爆出了  請給用戶復制權限的提示則按照提示在sysdba 下賦權限,如:
Sql代碼  
exec dbms_java.grant_permission('zhym','SYS:java.net.SocketPermission','192.168.9.12:18002','connect,resolve')   
  
exec dbms_java.grant_permission('ZHYM','SYS:java.net.SocketPermission','127.0.0.1:1521','connect,resolve')  
execdbms_java.grant_permission('zhym','SYS:java.net.SocketPermission','192.168.9.12:18002','connect,resolve') 
execdbms_java.grant_permission('ZHYM','SYS:java.net.SocketPermission','127.0.0.1:1521','connect,resolve') 
exec 后面的語句會在你的報錯提示中打印出來,只要前面加exec就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM