oracle 执行操作系统命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huryer/article/details/86690467

问题描述

Oracle数据库安装在windows 2008 远程服务器上,今天发现无法远程登录到windows,需要远程重启操作系统;
通过远程重启命令:shutdown /r /m \\192.168.1.2 /t 10仍然无法重启系统;
想到sqlserver可以通过xp_cmdshell执行操作系统命令,实现重启;
需要分析oracle是否有类似功能可以实现执行操作系统命令;

解决办法

/*
oracle 执行操作系统命令
如下命令需要在sqlplus下执行;
*/

-- 创建java source
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;
		}
	}
}
/

-- 创建调用函数
create or replace
function run_cmd(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
/

-- 创建存储过程
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := run_cmd(p_cmd);
end;
/

-- 用户赋权
exec dbms_java.grant_permission( 'user_name', 'SYS:java.io.FilePermission','<<ALL FILES>>', 'execute');
grant javasyspriv to user_name;
/
-- 收回权限
-- EXEC dbms_java.revoke_permission( 'user_name', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' );
-- revoke javasyspriv from user_name;
/

-- 调用测试
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
-- 查看IP配置
exec :x:=run_cmd('ipconfig');
-- 重启数据库
exec :x:=run_cmd('shutdown -r -t 3');

上述命令中,虽然设置3秒后重启操作系统,但实际执行时,需要等待操作系统关闭相关进程后,才能够重启,所以需要多等待一些时间,我这里大概10分钟左右,系统才完成重启。

猜你喜欢

转载自blog.csdn.net/huryer/article/details/86690467