在删除临时表时遇到了ORA-14452错误:ORA-14452: attempt to create , alert or drop an index on temporary table already in use。第一次碰到这种情况,问题解决过后,为了加深理解,特意参考网上资料,做了下面实验重现错误出现的场景,以及应该如何解决.

会话级临时表

由于实验需要两个或多个会话配合,所以使用SET SQLPROMPT来标识会话,如下所示,SESSION 1与SESSION 2:

Step 1:在会话1中创建了会话级的临时表TMP_TEST

 SQL> SET SQLPROMPT "SESSION 1 >"
SESSION 1 >CREATE GLOBAL TEMPORARY TABLE TMP_TEST
2 ( NAME VARCHAR2(12) ) ON COMMIT PRESERVE ROWS; Table created. SESSION 1 >INSERT INTO TMP_TEST VALUES('Kerry'); 1 row created. SESSION 1 >COMMIT; Commit complete. SESSION 1 >SELECT * FROM TMP_TEST; NAME
------------
Kerry

Step 2:打开另外一个会话2,在这个会话里面操作临时表TMP_TEST,插入数据。

 SQL> SET SQLPROMPT "SESSION 2 >"
SESSION 2 >SELECT * FROM TMP_TEST; no rows selected SESSION 2 >INSERT INTO TMP_TEST VALUES('Jimmy'); 1 row created. SESSION 2 >SELECT * FROM TMP_TEST; NAME
------------
Jimmy

Step 3: 在会话1中删除临时表时,就会出现ORA-14452错误。

 SESSION 1 >TRUNCATE TABLE TMP_TEST;

 Table truncated.

 SESSION 1 >DROP TABLE TMP_TEST;
DROP TABLE TMP_TEST
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

Step 4: 如果在会话2中先清空数据,然后去会话1中删除表则可顺利完成

 SESSION 2 >TRUNCATE TABLE TMP_TEST;

 Table truncated.

 SESSION 1 >DROP TABLE TMP_TEST;

 Table dropped.

事务级临时表

Step 1:  在会话1中创建事务级全局临时表。

 SESSION 1 >CREATE GLOBAL TEMPORARY TABLE TMP_TEST
2 ( NAME VARCHAR2(12) ) ON COMMIT DELETE ROWS; Table created. SESSION 1 >INSERT INTO TMP_TEST
2 VALUES('Kerry'); 1 row created. SESSION 1 >SELECT * FROM TMP_TEST; NAME
------------
Kerry SESSION 1 >COMMIT;

Step 2:在会话2中插入一条记录。

 SESSION 2 >INSERT INTO TMP_TEST VALUES('Jimmy');

 1 row created.

 SESSION 2 >SELECT * FROM TMP_TEST;

 NAME
------------
Jimmy

Step 3: 在会话3中删除全局临时表时就会报错

 SESSION 1 >SELECT * FROM TMP_TEST;

 no rows selected

 SESSION 1 >TRUNCATE TABLE TMP_TEST;

 Table truncated.

 SESSION 1 >DROP TABLE TMP_TEST;
DROP TABLE TMP_TEST
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

Step 4: 在会话2中提交后,即可在会话1中删除全局临时表。

SESSION 2 >COMMIT;

Commit complete.

总结:不管事务级还是会话级的临时表,都需要所有会话解除绑定,才能DROP,解除绑定的办法就是清空每个会话的数据.清空数据的办法:事务级别的临时表:COMMIT/TRUNCATE TABLE;会话级的临时表:TRUNCATE TABLE ;但是很多时候,如果出现了这种错误,但是我们不知道是那个用户的那个会话没有解除绑定,那么此时要如何解决呢?你可以用下面SQL语句来查询那个会话没有解除绑定,然后杀掉会话进程。

 SELECT SID, SERIAL# FROM V$SESSION V
WHERE SID IN (SELECT SID FROM V$LOCK L, DBA_OBJECTS O
WHERE L.ID1 = O.OBJECT_ID AND O.OBJECT_NAME =UPPER('TMP_TEST') ); ALTER SYSTEM KILL SESSION 'SID, SERIAL#';

或者你使用下面步骤一步一步的去定位那个会话没有解除绑定。

Step 1、先从DBA_OBJECTS/ALL_OBJECTS /USER_OBJECTS中查询到该表的OBJECT_ID:

SELECT OBJECT_ID FROM USER_OBJECTS WHERE OBJECT_NAME='TMP_TEST'

Step 2、根据查到的OBJECT_ID知道使用该表的SESSION: 
    SELECT * FROM V$LOCK WHERE ID1=&OBJECT_ID;

Step 3、在从v$session视图中查到该session的SID和SERIAL#:

SELECT * FROM V$SESSION WHERE SID=&SID;

Step 4、杀掉这些进程:

  ALTER SYSTEM KILL SESSION 'SID, SERIAL#';

参考资料:

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

ORA-14452的出现原因解析及解决方法的更多相关文章

  1. Code:Blocks 中文乱码问题原因分析和解决方法

    下面说说修改的地方. 1.修改源文件保存编码在:settings->Editor->gernal settings 看到右边的Encoding group Box了吗?如下图所示: Use ...

  2. 【FAQ】接入HMS Core推送服务,服务端下发消息常见错误码原因分析及解决方法

    HMS Core推送服务支持开发者使用HTTPS协议接入Push服务端,可以从服务器发送下行消息给终端设备.这篇文章汇总了服务端下发消息最常见的6个错误码,并提供了原因分析和解决方法,有遇到类似问题的 ...

  3. 二层安全之MAC Flooding解析与解决方法

    一.了解MAC Flooding原理 1.1 如图所示,网络中有3个PC和一个交换机,在正常情况下,如果PC A向PC B发送信息,PC C是不会知道的,过程都通过中间的交换机进行透明的处理,并且会记 ...

  4. MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法

    MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DETER ...

  5. 出现“unrecognized selector sent to instance”问题原因之一及解决方法。

      ​ 对于iPhone开发初学者来说,很想实现自己在iPhone上的第一个小程序,准备工作就绪侯就信心满满的开始了!一般来说大家可能都是从Hello World做起吧. 反正我是的,:),如果按照文 ...

  6. Hive数据倾斜的原因及主要解决方法

    数据倾斜产生的原因 数据倾斜的原因很大部分是join倾斜和聚合倾斜两大类 Hive倾斜之group by聚合倾斜 原因: 分组的维度过少,每个维度的值过多,导致处理某值的reduce耗时很久: 对一些 ...

  7. 安卓移动端line-height垂直居中出现偏移的原因,及解决方法

    目前在移动端安卓手机上使用line-height属性,让它的值等于height,结果发现是不居中的.出现了一定位置的偏移情况,如果略微只有两三个像素差距是看不出来的. 左图中的字号是12px,右图中的 ...

  8. Linux 动态库 undefined symbol 原因定位与解决方法

    在使用动态库开发部署时,遇到最多的问题可能就是 undefined symbol 了,导致这个出现这个问题的原因有多种多样,快速找到原因,采用对应的方法解决是本文写作的目的. 可能的原因 依赖库未找到 ...

  9. 【FAQ】华为帐号服务报错 907135701的常见原因总结和解决方法

    很多开发者在接入华为帐号服务时,经常会出现907135701的报错.根据官网文档说明,错误码907135701表示: 这个错误码在安卓和鸿蒙上都会出现,导致该报错的原因有很多,开发者可以按照下面几点进 ...

随机推荐

  1. geotrellis使用(十四)导出定制的GeoTiff

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 需求说明 实现方案 总结 一.前言        最 ...

  2. C++入门知识总结(1)

    1.有符号数和无符号数. 这个问题其实是一个很细的问题,我们还要把问题追溯到“位”,针对不同的“位”,那么能表示的最大数的范围不同.因为计算机存储数据都是以二进制的方式去存储的,即0和1,比如 110 ...

  3. 【集合框架】JDK1.8源码分析之LinkedHashMap(二)

    一.前言 前面我们已经分析了HashMap的源码,已经知道了HashMap可以用在哪种场合,如果这样一种情形,我们需要按照元素插入的顺序来访问元素,此时,LinkedHashMap就派上用场了,它保存 ...

  4. C++中的std详解

    以下内容为:本人看C++视频教程-范磊主讲(2.91G)视频学习笔记. 与大家分享下,希望可以帮助大家学习c++! 引例: #include<iostream> int main() { ...

  5. [译] MongoDB Java异步驱动快速指南

    导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...

  6. Linux iptables原理--数据包流向

    Iptable与Netfilter 在上一篇文章 linux iptables常用命令--配置一个生产环境的iptables 我们知道iptables有好几个表,如raw,mangle,nat,fil ...

  7. MapReduce 单词统计案例编程

    MapReduce 单词统计案例编程 一.在Linux环境安装Eclipse软件 1.   解压tar包 下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.ta ...

  8. DI和IOC

    DI和IOC是差不多的概念. 一个重要特征是接口依赖,是把对象关系推迟到运行时去确定. DI是一个初始化实例的过程,分为三种1.setter based 2.constructor based 3.i ...

  9. C#+arcengine10.0+SP5实现鹰眼(加载的是mdb数据库中的数据)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. XAF视频教程来啦,已出7课

        XAF交流学习群内的兄弟录制了视频,他没有博客,委拖我发至博客园,希望能让更多的开发人员受益.快速开发企业级应用的好工具!   XAF入门01快速浏览   XAF入门02特点. XAF入门03 ...