利用oracle执行系统命令
2016-04-11 11:04
429 查看
c:\1.sql
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;
}
}
}
c:\2.sql
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
c:\3.sql
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
登陆上去后依旧是依次执行
SQL> @c:\1.sql
/
@c:\2.sql
/
@c:\3.sql
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;
grant javauserpriv to system;(网上的方法没有这一行,我无法成功,加上去可以)
exec :x:=run_cmz('ipconfig'); 成功运行了命令
测试环境win2003+oracle11g
我在win2008r2+oracle11g成功
转自:
http://blog.chinaunix.net/uid-42741-id-3048036.html
网上还有一篇文章,不知道可不可以用
http://blog.csdn.net/tiwen818/article/details/7168363
方法二:
这个方法是在Navicat里面的操作
首先先新建Java,你写好的任意Java代码都行:
比如执行系统命令的Java代码:
写好之后点击保存,然后弹出一个对话框,请填写源名:Host (这个源名可以随便填)
然后
在调用外部程序之前,必须授权给数据库用户相应的权限
建立映射过程
这个NAME就是:类名加函数名
在navicat里面执行就是
再贡献一个自己写的一个读文件的java代码:
建立映射过程
调用:
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;
}
}
}
c:\2.sql
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
c:\3.sql
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
登陆上去后依旧是依次执行
SQL> @c:\1.sql
/
@c:\2.sql
/
@c:\3.sql
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;
grant javauserpriv to system;(网上的方法没有这一行,我无法成功,加上去可以)
exec :x:=run_cmz('ipconfig'); 成功运行了命令
测试环境win2003+oracle11g
我在win2008r2+oracle11g成功
转自:
http://blog.chinaunix.net/uid-42741-id-3048036.html
网上还有一篇文章,不知道可不可以用
http://blog.csdn.net/tiwen818/article/details/7168363
方法二:
这个方法是在Navicat里面的操作
首先先新建Java,你写好的任意Java代码都行:
比如执行系统命令的Java代码:
import java.io.*; public class Host { public static void executeCommand(String command) { try { String[] finalCommand; if (isWindows()) { finalCommand = new String[4]; // Use the appropriate path for your windows version. finalCommand[0] = "C:\\windows\\system32\\cmd.exe"; // Windows XP/2003 //finalCommand[0] = "C:\\winnt\\system32\\cmd.exe"; // Windows NT/2000 finalCommand[1] = "/y"; finalCommand[2] = "/c"; finalCommand[3] = command; } else { finalCommand = new String[3]; finalCommand[0] = "/bin/sh"; finalCommand[1] = "-c"; finalCommand[2] = command; } final Process pr = Runtime.getRuntime().exec(finalCommand); pr.waitFor(); new Thread(new Runnable(){ public void run() { BufferedReader br_in = null; try { br_in = new BufferedReader(new InputStreamReader(pr.getInputStream())); String buff = null; while ((buff = br_in.readLine()) != null) { System.out.println("Process out :" + buff); try {Thread.sleep(100); } catch(Exception e) {} } br_in.close(); } catch (IOException ioe) { System.out.println("Exception caught printing process output."); ioe.printStackTrace(); } finally { try { br_in.close(); } catch (Exception ex) {} } } }).start(); new Thread(new Runnable(){ public void run() { BufferedReader br_err = null; try { br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream())); String buff = null; while ((buff = br_err.readLine()) != null) { System.out.println("Process err :" + buff); try {Thread.sleep(100); } catch(Exception e) {} } br_err.close(); } catch (IOException ioe) { System.out.println("Exception caught printing process error."); ioe.printStackTrace(); } finally { try { br_err.close(); } catch (Exception ex) {} } } }).start(); } catch (Exception ex) { System.out.println(ex.getLocalizedMessage()); } } public static boolean isWindows() { if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1) return true; else return false; } };
写好之后点击保存,然后弹出一个对话框,请填写源名:Host (这个源名可以随便填)
然后
在调用外部程序之前,必须授权给数据库用户相应的权限
declare begin DBMS_JAVA.grant_permission('数据库用户','java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute,delete'); Dbms_Java.Grant_Permission('数据库用户','SYS:java.lang.RuntimePermission', 'writeFileDescriptor', ''); Dbms_Java.Grant_Permission('数据库用户','SYS:java.lang.RuntimePermission', 'readFileDescriptor', ''); end;
建立映射过程
CREATE OR REPLACE PROCEDURE host_command (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME'类名.executeCommand (java.lang.String)';
这个NAME就是:类名加函数名
在navicat里面执行就是
DECLARE l_output DBMS_OUTPUT.chararr; l_lines INTEGER := 1000; BEGIN DBMS_OUTPUT.enable(1000000); DBMS_JAVA.set_output(1000000); host_command('whoami'); --执行显示目录的命令 DBMS_OUTPUT.get_lines(l_output, l_lines); FOR i IN 1 .. l_lines LOOP DBMS_OUTPUT.put_line(l_output(i)); NULL; END LOOP; END;
再贡献一个自己写的一个读文件的java代码:
import java.io.*; public class readfile{ public static void readFileByLines(String fileName) { File file = new File(fileName); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String tempString = null; while ((tempString = reader.readLine()) != null) { System.out.println(tempString); } reader.close(); } catch (IOException e) { } } };
建立映射过程
CREATE OR REPLACE procedure funreadfile ( p_name VARCHAR2 ) as language java name 'readfile.readFileByLines(java.lang.String)';
调用:
DECLARE l_output DBMS_OUTPUT.chararr; l_lines INTEGER := 1000; BEGIN DBMS_OUTPUT.enable(1000000); DBMS_JAVA.set_output(1000000); host_command('dir c:\'); --系统指令 FUNREADFILE('c:\1.txt'); --读取文件 DBMS_OUTPUT.get_lines(l_output, l_lines); FOR i IN 1 .. l_lines LOOP DBMS_OUTPUT.put_line(l_output(i)); NULL; END LOOP; END;
相关文章推荐
- oracle IMP-00024: 只能指定一种模式 (TABLES, FROMUSER 或 FULL)
- 总结Oracle删除表空间遇到的问题
- 转:Oracle数据库sqlplus与plsqldev解决乱码
- Oracle中的Bulk Collect和FORALL
- [转]oracle表分区详解
- Oracle 10g RAC修改IP/VIP地址示例
- Oracle GI 日志收集工具 - TFA 简介
- Oracle 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段
- ORACLE临时表—ON COMMIT DELETE ROWS,ON COMMIT PRESERVE ROWS
- support.oracle.com-1344854.1-ebs工作流
- oracle 简述
- [数据库] Navicat for Oracle设置唯一性和递增序列实验
- oracle最大连接数
- oracle学习总结2
- ORACLE中的varchar2()与nvarchar2()的区别
- oracle11g 在 16核 64g 的pc server上利用hugePages提升性能
- Oracle之分页查询
- Oracle--分析函数
- 解决oracle 端口 1521 本机127可通 其他ip不通
- OracleClient使用整理