在删除临时表时遇到了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. kafka源码分析之二客户端分析

    客户端由两种:生产者和消费者 1. 生产者 先看一下生产者的构造方法: private KafkaProducer(ProducerConfig config, Serializer<K> ...

  2. objective-c中的@selector()和 c /c++的函数指针

    先看tomcat里用到的代码: //然后开始动画 //把图片放到animationImages,接受数组参数 self.tom.animationImages = arrayImage; //设置时间 ...

  3. 异步Promise实现

    简介 异步回调的书写往往打乱了正常流的书写方式,在ECMAScript 6中实现了标准的Promise API,旨在 解决控制回调流程的问题. 简单的实现了Promise API: (function ...

  4. Cesium原理篇:6 Renderer模块(2: Texture)

    Texture也是WebGL中重要的概念,使用起来也很简单.但有句话叫大道至简,如果真的想要用好纹理,里面的水其实也是很深的.下面我们来一探究竟. 下面是WebGL中创建一个纹理的最简过程: var ...

  5. Winform在线更新

    引言 2015年第一篇,Winform在线更新,算是重操旧业吧,09年刚到北京时一直做硬件联动编程,所以大多数时间都在搞Winform, 但是从来没做过在线更新这个功能,前几天参与部门另一个项目,上来 ...

  6. Go项目的目录结构

    项目目录结构如何组织,一般语言都是没有规定.但Go语言这方面做了规定,这样可以保持一致性,做到统一.规则化比较明确. 1.一般的,一个Go项目在GOPATH下,会有如下三个目录: |--bin |-- ...

  7. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  8. PR&AE插件开发遇到的一个坑

    经过一段时间的摸索,对Adobe Premiere Pro和After Effects系列插件的开发工作有了一定的掌握.如今公司需要针对Premiere Pro和After Effects开发另外一款 ...

  9. string转byte[]

    static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buff ...

  10. 【C#公共帮助类】JsonHelper 操作帮助类, 以后再也不用满地找Json了,拿来直接用

     四个主要操作类:JsonConverter .JsonHelper .JsonSplit .AjaxResult 一.JsonConverter: 自定义查询对象转换动态类.object动态类转换j ...