先把plsql关掉,关不掉就直接任务管理器杀掉plsql进程,然后重新登录。
--查看锁表进程SQL语句(可确定执行的语句是否有锁表)
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;
一、执行sql语句卡住了,点小闪电也停不下来时。
1、先根据登录的用户名查到
select a.sid, a.program, b.pid ,b.spid, c.sql_text,c.SQL_ID
from v$session a, v$process b, v$sqlarea c
where a.paddr = b.addr
and a.sql_hash_value = c.hash_value
and a.username = '执行卡住sql语句的用户名';
2、杀进程(用sysdba权限的用户登录,不行就直接试试第三步)
alter system kill session '39,31012' immediate; --参数为'sid,serial#',用于停止这个回话,同时也终止了存储过程
3、要是第二步提示没权限,就进入command window 命令行模式输入 kill -9 spid
4、执行完查一下进程状态,status = INACTIVE 就说明成功了。再查一下最上面的锁表查询语句,没查到就对了。
SELECT Saddr, Sid, Serial#, Paddr, Username, Status
FROM V$session t
WHERE t.SID = '39'
二、执行存储过程卡住了,点小闪电也停不下来时。
第一步:查询SID
select * from v$access a where object like '存储过程名%' --存储过程名为大写字母
第二步:查询serial#
select * from v$session where sid=39 --39为上一个查询得到的SID值,可能是多个,这里找到他们对应的serial#值
第三步:删除进程(这步不好用就参考上面命令行kill的试试)
alter system kill session '39,11234' --参数为'sid,serial#',用于停止这个回话,同时也终止了存储过程