背景:我在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
参考资料: