利用oracle执行系统命令

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;


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用存储过程批量导入SQL文件,你可以使用以下步骤: 1. 创建一个存储过程,该存储过程将读取SQL文件并执行其中的SQL语句。以下是一个示例存储过程的框架: ```sql CREATE OR REPLACE PROCEDURE execute_sql_file ( p_file_path VARCHAR2 ) AS -- 声明变量 l_sql_script CLOB; BEGIN -- 读取SQL文件内容到变量 SELECT CONTENT INTO l_sql_script FROM (SELECT DBMS_LOB.SUBSTR(BFILENAME('DIRECTORY_NAME', p_file_path), DBMS_LOB.GETLENGTH(BFILENAME('DIRECTORY_NAME', p_file_path))) AS CONTENT FROM DUAL); -- 执行SQL语句 EXECUTE IMMEDIATE l_sql_script; EXCEPTION -- 处理异常 WHEN OTHERS THEN -- 在这里处理异常情况 -- 可以记录日志或者抛出自定义异常等 END; / ``` 在上述代码中,你需要根据实际情况替换`DIRECTORY_NAME`为你的Oracle目录对象的名称。 2. 确保你已经在Oracle数据库中创建了一个目录对象,用于指向SQL文件所在的目录。你可以使用以下命令创建目录对象: ```sql CREATE DIRECTORY directory_name AS 'directory_path'; ``` 其中,`directory_name`是目录对象的名称,`directory_path`是SQL文件所在的目录路径。 3. 调用存储过程来批量导入SQL文件。以下是一个示例调用的语法: ```sql BEGIN execute_sql_file('file_path'); END; ``` 其中,`file_path`是要导入的SQL文件路径。 通过使用存储过程,你可以更加灵活地处理批量导入过程中的各种操作,例如数据转换、验证和错误处理等。请根据实际需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值