網上百度到了出現這種現象緣由,說的好像還挺有道理的,因此就copy過來:sql
在對Procedure、Function或Package進行Debug時,若是長時間沒有操做,公司的防火牆會殺掉會話鏈接。這個時候數據庫不會主動的釋放會話的資源,若是再次對Procedure、Function或Package進行Debug的話,就會產生等待。由於被防火牆殺掉的會話還在運行着上次的Debug,會有鎖的存在。只用等到數據庫回收上次Debug的會話資源或者DBA手動將會話KILL掉。數據庫
手動kill session的方法:
session
1.SELECT * FROM V$DB_OBJECT_CACHE WHERE NAME=upper('PROCEDURE_NAME') AND LOCKS!='0'; 注意: PROCEDURE_NAME爲存儲過程的名稱。
2.SELECT SID FROM V$ACCESS WHERE OBJECT='PROCEDURE_NAME';
3.SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='SID';
4.ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
或者 select vs.SID, vs.SERIAL#, vs.PADDR, 'ALTER SYSTEM KILL SESSION ''' || vs.SID || ',' || vs.SERIAL# || ''' IMMEDIATE;' from V$ACCESS va, V$SESSION vs where 1 = 1 and va.SID = vs.SID and va.OBJECT = upper('SZA_PA_BGT_ADJ_COMMON_PUB')