以下方法在WINNT,Linux下的Oracle9i上测试通过 首先给使用Java存储过程的用户授予一定的权限 <>表示所有文件,也可以单独指定文件。 r w e d表示四种操作 Code:
Dbms_Java.Grant_Permission('HR', 'java.io.FilePermission', '<<ALL FILE>>', '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 http://java.sun.com/j2se/1.3/doc ... timePermission.Html http://java.sun.com/j2se/1.3/doc ... rityPermission.html http://java.sun.com/j2se/1.3/docs/api/java/io/FilePermission.html and http://download-east.oracle.com/ ... 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:\oracle\ora92\DATABASE>cmd /c c:\oracle\ora92\DATABASE>dir Volume in drive C is 本地磁盘 Volume Serial Number is 5CE1-2622 Directory of c:\oracle\ora92\DATABASE 2004-05-15 15:47 <DIR> . 2004-05-15 15:47 <DIR> .. 2002-12-24 20:13 <DIR> 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
|