您的位置:首页 > 数据库 > Oracle

利用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代码:

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: