当前位置: 代码迷 >> Oracle开发 >> 如何查看存储过程是否正在执行并手动停止
  详细解决方案

如何查看存储过程是否正在执行并手动停止

热度:102   发布时间:2016-04-24 06:41:58.0
怎么查看存储过程是否正在执行并手动停止
我在plsql 里编译一个存储过程, 窗口卡死, v$session 里出现 library cache pin 事件, 说明这个存储过程应该正在执行;

于是我想通过kill 会话来停止这个正在执行的存储过程;

--下面语句可以查到这个存储过程的记录, pins=0, locks=0
select t.name, t.pins, t.locks, t.* from v$db_object_cache t where upper(t.name) = 'PROC_NAME';

--但是查sid, v$access 里没有这个过程 (sys.v_$access里也没有)
select t.sid, t.* from v$access t where upper(t.object) = 'PROC_NAME';


我的疑问是, 这个存储过程到底是不是正在执行? 怎么把它手动停掉?  求教, 谢谢~
------解决方案--------------------
1)查找死锁的进程:
sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS 
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2)kill掉这个死锁的进程:
  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
3)如果还不能解决:
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
  其中sid用死锁的sid替换: exit
ps -ef
------解决方案--------------------
grep spid
  其中spid是这个进程的进程号,kill掉这个Oracle进程
from:http://southking.javaeye.com/blog/550832

如果实在还不行,允许的话重启oracle服务

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

一般我都是直接在v$session中直接找到SID 和serial#来kill掉会话


问题是怎么确定执行这个存储过程的是哪个会话呢


select DISTINCT T1.SID,T1.SERIAL#,T2.SQL_TEXT from v$session T1,V$OPEN_CURSOR T2 WHERE T1.SADDR=T2.SADDR;
------解决方案--------------------
plsql 看下 v$session ,应该很直观的看到sql把,kill掉即可。
  相关解决方案