ORA-14452的出现缘由解析及解决方法

背景:我在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


参考资料:

    http://blog.itpub.net/70612/viewspace-1034301/

相关文章
相关标签/搜索