背景:我在oracle中寫了一個存儲過程,經過oracle的job進行調用,這個存儲過程的大概意思是這樣的:我先從n張表裏各類取數據,而後把數據整理一下,存到一張中間表中,而後根據用戶的操做(每一個用戶天天要維護一下本身今日的收支),若是用戶錄入了信息,則將錄入信息update到中間表去,若是沒有信息,則默認的把數據插入中間表,等這一部分完成,而後將中間表的數據插入到真正的業務表;就在這個時候,我想修改一下中間表的字段,提示ORA-14452,而後我就把存儲過程備份後連同job也被我刪掉了,而後我再alter表的時間居然仍是ORA-14452,因而我就百思不得其解了。上網查詢答案以後我整理下:sql
總結:無論事務級仍是會話級的臨時表,都須要全部會話解除綁定,才能DROP,解除綁定的辦法就是清空每一個會話的數據.清空數據的辦法:事務級別的臨時表:COMMIT/TRUNCATE TABLE;會話級的臨時表:TRUNCATE TABLE ;可是不少時候,若是出現了這種錯誤,可是咱們不知道是那個用戶的那個會話沒有解除綁定,那麼此時要如何解決呢?你能夠用下面SQL語句來查詢那個會話沒有解除綁定,而後殺掉會話進程。session
1 SELECT SID, SERIAL# FROM V$SESSION V 2 WHERE SID IN (SELECT SID FROM V$LOCK L, DBA_OBJECTS O 3 WHERE L.ID1 = O.OBJECT_ID AND O.OBJECT_NAME =UPPER('TMP_TEST') ); 4 5 ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
或者你使用下面步驟一步一步的去定位那個會話沒有解除綁定。oracle
Step 一、先從DBA_OBJECTS/ALL_OBJECTS /USER_OBJECTS中查詢到該表的OBJECT_ID:spa
SELECT OBJECT_ID FROM USER_OBJECTS WHERE OBJECT_NAME='TMP_TEST'.net
Step 二、根據查到的OBJECT_ID知道使用該表的SESSION:
SELECT * FROM V$LOCK WHERE ID1=&OBJECT_ID;code
Step 三、在從v$session視圖中查到該session的SID和SERIAL#:blog
SELECT * FROM V$SESSION WHERE SID=&SID;進程
Step 四、殺掉這些進程:事務
ALTER SYSTEM KILL SESSION 'SID, SERIAL#';get
參考資料: