利用oracle儲存過程執行作業系統命令

jss001發表於2009-02-10
以下方法在WINNT,LINUX下的oracle9i上測試透過,java過程呼叫系統命令
  
  首先給使用java儲存過程的使用者授予一定的許可權
  <>表示所有檔案,也可以單獨指定檔案。
  r w e d表示四種操作
  
  
   Code:
  Dbms_Java.Grant_Permission('HR',
  'java.io.FilePermission', '<>',
  'read ,write, execute, delete');
  
  Dbms_Java.Grant_Permission('HR',
  'java.io.FilePermission', 'd:aa.bat',
  'read ,write, execute, delete');
  
   dbms_java.grant_permission
    ('HR',
    'java.lang.RuntimePermission',
    '*',
    'writeFileDescriptor' );
   end;
   /
  PL/SQL procedure successfully completed.
  
  See
  
   ... timePermission.html
  
   ... rityPermission.html
  
  s/api/java/io/FilePermission.html
  
  and
  
   ... 53/perf.htm#1001971
  From the “Java Developer’s Guide”, Part No. A81353-01, Chapter 5:
  
  Table 5?1 Permission Types
  n java.util.PropertyPermission
  n java.io.SerializablePermission
  n java.io.FilePermission
  n java.net.NetPermission
  n java.net.SocketPermission
  n java.lang.RuntimePermission
  n java.lang.reflect.ReflectPermission
  n java.security.SecurityPermission
  n oracle.aurora.rdbms.security.PolicyTablePermission
  n oracle.aurora.security.JServerPermission
  
  相關的java類如下
  SQL> connect hr/hr@ts
  已連線。
  
  create or replace and compile
    java source named "Util"
    as
    import java.io.*;
   import java.lang.*;
    public class Util extends Object
    {
    public static int RunThis(String args)
    {
    Runtime rt = Runtime.getRuntime();
    int    rc = -1;
    try
    {
    Process p = rt.exec(args);
    int bufSize = 4096;
    BufferedInputStream bis =
     new BufferedInputStream(p.getInputStream(), bufSize);
     int len;
     byte buffer[] = new byte[bufSize];
     // Echo back what the program spit out
    while ((len = bis.read(buffer, 0, bufSize)) != -1)
       System.out.write(buffer, 0, len);
      rc = p.waitFor();
    }
     catch (Exception e)
     {
      e.printStackTrace();
      rc = -1;
     }
    finally
    {
      return rc;
     }
     }
    }
   /
  
  Java created.
  
  建立函式
  
  create or replace
  function RUN_CMD(p_cmd in varchar2) return number
    as
   language java
    name 'Util.RunThis(java.lang.String) return integer';
  /
  
  Function created.
  
  建立一過程呼叫函式
   create or replace procedure RC(p_cmd in varchar2)
   as
    x number;
   begin
    x := run_cmd(p_cmd);
   end;
   /
  
  Procedure created.
  
  SQL> variable x number;
  SQL> set serveroutput on
  SQL> exec dbms_java.set_output(100000);
  
  PL/SQL procedure successfully completed.
  
  可以執行相應的命令和bat檔案
  SQL> exec :x := RUN_CMD('ipconfig');
  
  Windows 2000 IP Configuration
  
  Ethernet adapter 本地連線
  :
  
      Connection-specific DNS Suffix . :
      IP Address. . . . . . . . . . . . : 172.18.25.102
      Subnet Mask . . . . . . .
  . . . . : 255.255.255.0
      Default Gateway . . . . . . . . . : 172.18.25.1
  
  PL/SQL 過程已成功完成。
  
  也可以執行伺服器上的bat檔案
  SQL>  exec :x := RUN_CMD('c:aa.bat');
  c:oracleora92DATABASE>cmd /c
  c:oracleora92DATABASE>dir
  Volume in drive C is 本地磁碟
  Volume Serial Number is 5CE1-2622
  Directory of c:oracleora92DATABASE
  2004-05-15 15:47         .
  2004-05-15 15:47         ..
  2002-12-24 20:13         archive
  1998-09-09 18:31        31,744 oradba.exe
  2004-05-08 11:48         568 OraDim.Log
  2004-03-17 11:53        1,536 PWDweblish.ora
  2004-05-15 15:47      1,871,872 SNCFWEBLISH.ORA
  2003-12-29 13:24        2,560 SPFILEWEBLISH.ORA
  2004-05-08 11:48        12,852 sqlnet.log
  6 File(s)   1,921,132 bytes
  3 Dir(s)  7,141,621,760 bytes free
  
  -----------------
  c:aa.bat如下:
  
  cmd /c
  dir
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017123/,如需轉載,請註明出處,否則將追究法律責任。

相關文章