请问怎么在存储过程中执行操作系统的命令?如kill命令。

[复制链接]
查看11 | 回复3 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
请问怎么在存储过程中执行操作系统的命令?如kill命令。
8.17数据库中 Unix下
谢谢
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
Use dbms_java package, create a storeprocedure to call unix command.
You can refer to TOM expert-one-on-one or search this topic in this bbs.
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
谢谢mistfire
我是想在视图中查找出状态为SNIPED(不知道拼错了没有?)的SESSION对应的系统进程,然后用操作系统命令KILL,把这些无效的会话KILL掉,不知道这样的做法是否合理?
请mistfire及大伙指教。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
如何利用java过程执行操作系统命令
不指定以前有没有人贴过。最近用到挺好用的。
以下方法在WINNT,LINUX下的oracle9i上测试通过
首先给使用java存储过程的用户授予一定的权限
表示所有文件,也可以单独指定文件。
r w e d表示四种操作

begin
Dbms_Java.Grant_Permission('HR',
'java.io.FilePermission', '>',
'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类如下

Code: [Copy to clipboard]
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();
intrc = -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文件

Code: [Copy to clipboard]
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-1515:47
.
2004-05-1515:47
..
2002-12-2420:13
archive
1998-09-0918:31
31,744 oradba.exe
2004-05-0811:48
568 OraDim.Log
2004-03-1711:53
1,536 PWDweblish.ora
2004-05-1515:47
1,871,872 SNCFWEBLISH.ORA
2003-12-2913:24
2,560 SPFILEWEBLISH.ORA
2004-05-0811: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

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行