存储过程卡住怎么杀死
时间: 2023-11-10 16:20:29 浏览: 44
当存储过程卡住时,您可以尝试以下步骤来杀死它:
第一步:查询SID。使用以下SQL语句查询SID:
```
select * from v$access a where object like '存储过程名%' --存储过程名为大写字母
```
其中,“存储过程名”是您要查询的存储过程的名称。记下查询结果中的SID值。
第二步:查询serial#。使用以下SQL语句查询serial#:
```
select * from v$session where sid=39 --39为上一个查询得到的SID值,可能是多个,这里找到他们对应的serial#值
```
其中,39应替换为前一步查询得到的SID值。记下查询结果中的serial#值。
第三步:删除进程。使用以下SQL语句删除进程:
```
alter system kill session '39,11234' --参数为'sid,serial#',用于停止这个回话,同时也终止了存储过程
```
其中,39和11234应替换为前两步查询得到的SID和serial#值。
如果上述步骤无效,您可以尝试以下方法:
1. 关闭PL/SQL开发工具,如果无法关闭,请使用任务管理器强制结束PL/SQL进程,然后重新登录。
2. 使用以下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语句的用户名';
```
其中,'执行卡住sql语句的用户名'应替换为您卡住的SQL语句所属的用户名。记下查询结果中的SID和serial#值。
2. 杀死进程。使用以下SQL语句杀死进程:
```
alter system kill session '39,31012' immediate; --参数为'sid,serial#',用于停止这个回话,同时也终止了存储过程
```
其中,39和31012应替换为前一步查询得到的SID和serial#值。
3. 如果前一步提示没有权限,您可以进入命令行模式,使用以下命令杀死进程:
```
kill -9 spid
```
其中,spid应替换为前一步查询得到的spid值。
请注意以下事项:
1. 如果您杀死了进程,但在表中仍然可以查询到相关信息,请耐心等待几分钟,然后再次查询,可能状态已变为inactive。
2. 一般情况下,登录管理员用户后直接杀死进程即可,不需要进行复杂的操作。但如果无法获得管理员权限,可以尝试上述方法。
请确保您使用这些操作时具有适当的权限和谨慎操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>