在Oracle的存储过程中如何执行杀掉某进程的命令??

[复制链接]
查看11 | 回复8 | 2007-9-26 18:42:10 | 显示全部楼层 |阅读模式
在Oracle的存储过程中如何执行杀掉某进程的命令(orakill oracle_sid 1234)??
我想写一个存储过程,定期杀掉另外一个存储过程被死锁的进程。代码如下:
CREATE OR REPLACEPROCEDURE P_Testas
myRecnum number(10);
mySID number(10);
mySpid number(10);
cursor c_test is SELECT SID FROM V$ACCESS WHERE OWNER='AAA' AND object = 'PROC1' and type = 'PROCEDURE';
begin
myRecnum:=0;
SELECT count(*) into myRecnum FROM V$DB_OBJECT_CACHE WHERE OWNER='AAA' AND name = 'PROC1' andLOCKS'0';
if myRecnum > 0 then
open c_test;
fetch c_test into mySID;
while c_test%FOUND LOOP
select spid into mySpid from v$session s,v$process p where s.paddr=p.addr and s.sid = mySID;
--杀掉进程
orakill Oracle_SID mySpid ;
fetch c_test into mySID;
end LOOP;
close c_test;
end if;
end;
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
高手快帮帮忙啊!
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
没有人知道吗
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
select sid,serial# from v$session
exec immediate 'alter system kill session ...'
但我不觉得你写这样一个存储过程是个好办法。既然知道另一个存储过程会锁对象那就改啊。
[ 本帖最后由 油菜 于 2009-5-6 12:38 编辑 ]
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
看看这个如何:
CREATE OR REPLACEPROCEDURE P_Testas
myRecnum number(10);
mySID number(10);
mySpid number(10);
mySerial number(10);
myPaddr number(10);
cursor c_test is SELECT SID FROM V$ACCESS WHERE OWNER='AAA' AND object = 'PROC1' and type = 'PROCEDURE';
begin
myRecnum:=0;
SELECT count(*) into myRecnum FROM V$DB_OBJECT_CACHE WHERE OWNER='AAA' AND name = 'PROC1' andLOCKS'0';
if myRecnum > 0 then
open c_test;
fetch c_test into mySID;
while c_test%FOUND LOOP
select serial# into mySerial from v$session where sid=mySID;
select paddr into myPaddr from v$session where sid=mySID;
select spid into mySpid from v$process paddr=myPaddr;
--杀掉进程
exec immediate 'alter system kill session 'mySID,mySerial'';
orakill Oracle_SID mySpid ;

end LOOP;
close c_test;
end if;
end;
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
CREATE OR REPLACEPROCEDURE P_Testas
myRecnum number(10);
mySID number(10);
mySpid number(10);
mySerial number(10);
myPaddr number(10);
cursor c_test is SELECT SID FROM V$ACCESS WHERE OWNER='AAA' AND object = 'PROC1' and type = 'PROCEDURE';
begin
myRecnum:=0;
SELECT count(*) into myRecnum FROM V$DB_OBJECT_CACHE WHERE OWNER='AAA' AND name = 'PROC1' andLOCKS'0';
if myRecnum > 0 then
open c_test;
fetch c_test into mySID;
while c_test%FOUND LOOP
select serial# into mySerial from v$session where sid=mySID;
select paddr into myPaddr from v$session where sid=mySID;
select spid into mySpid from v$process paddr=myPaddr;
fetch c_test into mySID;
--杀掉进程
exec immediate 'alter system kill session 'mySID,mySerial'';

orakill Oracle_SID mySpid ;

end LOOP;
close c_test;
end if;
end;
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
好像通过ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';杀掉后,进程还是很长时间锁定系统资源,不释放。所以想在操作系统级强行杀掉。
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
油菜 :
因为另一个存储过程是一个往远程数据库插入数据的存储过程,很简单,经常因为网络或其他原因被锁,每次都要重启计算机才能解决问题。
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
原帖由 skyrocket 于 2009-5-6 15:05 发表
好像通过ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';杀掉后,进程还是很长时间锁定系统资源,不释放。所以想在操作系统级强行杀掉。

如果杀掉数据库的session都不释放的话,你杀系统进程没有用的,锁定系统资源是因为在回滚,这个时候你杀掉系统的进程可能会引起恢复,这个时间好像省不掉的
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行