Oracle中嵌入java程序

在Oracle中使用java代码 

1.  ——————————windows下可以成功调用ipconfig等命令———————————————————     

2.    CREATE   OR   REPLACE   AND   RESOLVE   JAVA   SOURCE   NAMED   "EvokeOsCmd"   AS     

3.    import   java.io.*;     

4.    import   java.lang.*;     

5.    public   class   EvokeOsCmd   extends   Object{     

6.        public   static   void   main(String   []   args){     

7.            EvokeOsCmd   oscmd   =   new   EvokeOsCmd();     

8.          oscmd.runOsCmd();     

9.        

10.         }     

11.         public   void   runOsCmd(){     

12.       

13.               try   {     

14.                   //   Execute   a   command   with   an   argument   that   contains   a   space     

15.                   //String[]   commands   =   new   String[]{"grep",   "hello   world",   "/tmp/f.txt"};     

16.                   //commands   =   new   String[]{"grep",   "hello   world",   "c:\Documents   and   Settings\f.txt"};     

17.                       System.out.println("Starting   run.sh");     

18.                   //String   command   =   "cmd.exe   /c   dir";     

19.                       String   command   =   "ipconfig";                 //String   command   =   "notepad";     

20.                   Process   p   =   Runtime.getRuntime().exec(command);     

21.       

22.                               int   bufSize=4096;     

23.                               BufferedInputStream   bis=     

24.                                               new   BufferedInputStream(p.getInputStream(),bufSize);     

25.                                               int   len;     

26.                                               byte   buffer[]=new   byte[bufSize];     

27.                                               while((len=bis.read(buffer,0,bufSize))!=-1)     

28.                                                                         System.out.write(buffer,0,len);     

29.       

30.                                               p.waitFor();     

31.                   System.out.println("Starting   run.sh   successfully   complete");     

32.                               }catch   (Exception   e)     

33.                               {     

34.                         e.printStackTrace();     

35.                         }     

36.       }     

37.       

38.       

39.   }     

40.  /     

41.   —————————–     

42.   CREATE   OR   REPLACE   PROCEDURE   RUN_OSCMD   as   language   java     

43.   name   ’EvokeOsCmd.main   (java.lang.String[])’;     

44.   /     

45.   —————————–     

46.   begin     

47.       dbms_java.grant_permission(USER,’java.io.FilePermission’,'*’,'execute,write,read’);     

48.       –dbms_java.grant_permission(USER,’java.io.FilePermission’,'*’,'execute,write,read’);     

49.       dbms_java.grant_permission(USER,’java.lang.RuntimePermission’,'*’,'writeFileDescriptor’);     

50.   end;     

51.   /     

52.   —————————–     

53.   set   serveroutput   on   size   1000000     

54.   exec   dbms_java.set_output(1000000);     

55.   —————————–     

56.   exec   run_oscmd;     

57.   /   

 

http://blog.sina.com.cn/s/blog_580f7e0d010004w9.html

 

前几天,做了一个这样的东西。Oracle中的某个表发生变化时,利用Trigger调用,内嵌在Oracle中的java程序中的Socket,来通知java主程序来做操作。网上的资料比较少,我辛辛苦苦做出来了。结果,这几天说要弃之不用。非常痛心。在此,记录,以表痛心。

主程序:就不多说了,就是个Socket。在Oracle中内嵌一个类              import java.net.*;
import java.io.*;
public class EXTRACT_BY_ID{
  private static String ID="";  //包括主键和操作描述
  private static Socket server;
  public static String getID()
  {
    return ID;
  }
  public static String setID(String id,String tName) throws Exception
  {
     String tempStr="";
     String temp="";
     boolean flag = false;
     ID=id;
     try
     {
       for(int i=1;i<5;i++)
       {
         temp=send(tName+"&"+id);         
         if(temp.equals("true"))
          {
            flag = true;
            tempStr="true";
            break;
           }
        }
        
      }catch(Exception e)
      {
        tempStr=tempStr+temp+";setid–>otherEx;"+e.toString();
      }
     return tempStr;
  }
 
    public static String send(String str) throws Exception
  {
    String tempStr = "";
    boolean flag = true;
    Socket client = new Socket(InetAddress.getLocalHost(),5000);
    try{
     
      //向本机的5000端口发出客户请求
      BufferedReader in = new BufferedReader(
          new InputStreamReader(client.getInputStream()));
      //由系统标准输入设备构造BufferReader对象
      PrintWriter out = new PrintWriter(client.getOutputStream());
      //由Socket对象得到输出流,并构造PrintWriter对象
      out.println(str);  //向服务器端,发送数据。
      out.flush();
      while(true){
        String s = in.readLine();//接收到的数据
        System.out.println(s);
        if(s.equals("end"))
        {
          tempStr="true";
          break;
        }else if(s.equals("error"))
        {
           tempStr="false";
           break;
        }
      }
      tempStr="true";
      client.close();
    }catch(Exception e)
   {
     tempStr=tempStr+"send–>otherEx;"+e.toString();
     client.close();
   }
   return tempStr;
  }
}

然后,在Oracle函数中建立一个这样的函数,把Oracle的函数同Oracle的某个类的某个方法联系起来,注意参数和返回值得匹配:

CREATE OR REPLACE  FUNCTION "MZJ"."SET_ID" (t in varchar2,tName
    in varchar2) return varchar2
as language java name ‘EXTRACT_BY_ID.setID(java.lang.String,java.lang.String)return java.lang.Sting’;

 在Oracle中再写一个Trigger调用,上述的函数,达到调用Oracle中内嵌Java类的效果。 Trigger如下:

CREATE OR REPLACE TRIGGER "MZJ"."TRI_INSERT_AFTER_A" AFTER
INSERT ON "A" FOR EACH ROW declare t varchar2(4000); id varchar2(25);
begin
  id:=to_char(sysdate,’yyyyMMddHH24miss’);
  insert into MZJ.A_BEIFEN(beifen_id,type,a1,a2,a3,a4)
  values(id,’insert’,:new.a1,:new.a2,:new.a3,:new.a4);
  dbms_java.grant_permission( ‘MZJ’, ‘SYS:java.net.SocketPermission’, ’127.0.0.1:5000′, ‘connect,resolve’);
  t:=MZJ.SET_ID(id,’A_BEIFEN’);
 
end;

 这样就可以达到想要的效果了。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>