在调试存储过程时,调用之后一直提示“正在执行中”,正常情况下数据量不大早应该结束了,检查之后发现有一个参数没设置自增导致了死循环。

询问同事如何终止该存储过程,同事说尝试一下重新编译...结果编译界面也死了淦

本来是想着自己的数据库 直接重启试试 ;但是本着严谨的态度,找到了最终的解决方案!
查阅动态性能视图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.再次编译存储过程

编译成功,至此会话被杀死,问题解决。
4202

被折叠的 条评论
为什么被折叠?



