在调试存储过程时,调用之后一直提示“正在执行中”,正常情况下数据量不大早应该结束了,检查之后发现有一个参数没设置自增导致了死循环。
询问同事如何终止该存储过程,同事说尝试一下重新编译...结果编译界面也死了淦
本来是想着自己的数据库 直接重启试试 ;但是本着严谨的态度,找到了最终的解决方案!
查阅动态性能视图v$db_object_cache
列名 | 数据类型 | 描述 |
OWNER | VARCHAR2(64) | 对象所有者(如果是应用的sql语句,此列值一般都为空) |
NAME | VARCHAR2(1000) | 对象名称 (sql语句或者匿名块/游标的前1000个字符) |
DB_LINK | VARCHAR2(64) | 数据库的链接名 如果存在dblink |
NAMESPACE | VARCHAR2(28) | 库缓存中对象命名类型: TABLE/PROCEDURE, BODY, TRIGGER, INDEX,CLUSTER, OBJECT |
TYPE | VARCHAR2(28) | 对象类型 (for example, sequence, procedure, function, package, package body, trigger) |
SHARABLE_MEM | NUMBER | 对象占用可共享内存的大小(单位:btyes) |
LOADS | NUMBER | 这个对象被加载到内存的次数. 当这个对象无效的时候这个值仍然会增加. |
EXECUTIONS | NUMBER | 无效的(Not used. See V$SQLAREA to see actual execution counts.) |
LOCKS | NUMBER | 当前锁住这个对象的session数 |
PINS | NUMBER | 当前执行这个对象的session数 |
KEPT | VARCHAR2(3) | 告知是否对象常驻shared pool(yes/no),有赖于这个对象是否已经利用PL/SQL 过程DBMS_SHARED_POOL.KEEP“保持”(永久固定在内存中) |
CHILD_LATCH | NUMBER | 保护这个对象的子锁数目. |
查阅被锁对象信息视图v$access
列名 | 数据类型 | 描述 |
SID | NUMBER | 访问一个对象的会话ID |
OWNER | VARCHAR2(64) | 对象的拥有者 |
OBJECT | VARCHAR2(1000) | 对象名称 |
TYPE | VARCHAR2(24) | 对象的类型标识符 |
查阅基础信息视图v$session
列名 | 数据类型 | 描述 |
SADDR | RAW(4 | 8) | 会话地址 |
SID | NUMBER | 会话标识符 |
SERIAL# | NUMBER | 会话序列号。用于唯一标识会话的对象。保证在会话结束且另一个会话以相同的会话 ID 开始时,将会话级命令应用于正确的会话对象。 |
AUDSID | NUMBER | 审核会话 ID |
PADDR | RAW(4 | 8) | 拥有会话的进程的地址 |
USER# | NUMBER | Oracle 用户标识符 |
USERNAME | VARCHAR2(128) | Oracle 用户名 |
(详见V$SESSION)
1.查询被锁存储过程
select * from v$db_object_cache where locks<>0 and type='PROCEDURE';
2.查询搜索到的存储过程名称
SELECT * FROM V$ACCESS WHERE object='PROCESS_STUDENT';
3.查询该会话的会话序列号
SELECT SID,SERIAL# FROM V$SESSION WHERE SID='620';
4.杀死该会话
alter system kill session '620,28350';
5.再次执行第1步语句查询是否还存在被锁会话
6.再次编译存储过程
编译成功,至此会话被杀死,问题解决。