Oracle临时表ORA-14552错误
2008-09-02 12:47:13 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

在处理临时表的时候经常会碰到这个错误。
最简单的例子:
SQL>createGLOBALTEMPORARYTABLET_TEMP 2(IDNUMBER) 3ONCOMMITPRESERVEROWS;
表已创建。
SQL>insertINTOT_TEMPVALUES(1);
已创建 1 行。
SQL>dropTABLET_TEMP; dropTABLET_TEMP
*第 1 行出现错误:
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
这时无论是ROLLBACK、COMMIT还是删除表中的数据都无法解决问题:
SQL>ROLLBACK;
回退已完成。
SQL>dropTABLET_TEMP; dropTABLET_TEMP
*第 1 行出现错误:
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
SQL>deleteT_TEMP;
已删除 1 行。
SQL>COMMIT;
提交完成。
SQL>dropTABLET_TEMP; dropTABLET_TEMP
*第 1 行出现错误:
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
唯一可以使用的方法是先truncate临时表,然后进行删除:
SQL>truncateTABLET_TEMP;
表被截断。
SQL>dropTABLET_TEMP;
表已删除。
Oracle在metalink文档Doc ID: Note:270645.1中描述了这个问题。
如果是其他会话导致了这个问题:
SQL>createGLOBALTEMPORARYTABLET_TEMP 2(IDNUMBER) 3ONCOMMITPRESERVEROWS;
表已创建。
SQL>insertINTOT_TEMPVALUES(1);
已创建 1 行。
在其他的会话试图删除临时表:
SQL>SETSQLP’SQL2>’ SQL2>dropTABLET_TEMP; dropTABLET_TEMP
*第 1 行出现错误:
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
SQL2>truncateTABLET_TEMP;
表被截断。
SQL2>dropTABLET_TEMP; dropTABLET_TEMP
*第 1 行出现错误:
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
这时要不然等待使用临时表的事务主动是否锁,比如truncate或者断开会话,要不然就需要通过KILL SESSION的方式来杀掉占有锁的会话:
SQL>DISC从OracleDatabase10gEnterpriseEditionRelease10.2.0.1.0-Production
With the Partitioning, OLAP and Data Mining options 断开
会话1断开,会话2就可以删除临时表了:
SQL2>dropTABLET_TEMP;
表已删除。
问题在于,Oracle修改ON COMMIT PRESERVE ROWS的临时表后不会主动释放锁,必须要断开会话或者执行truncate操作才能释放:
SQL>CONNYANGTK/YANGTK@YTK102已连接。 SQL>selectSIDFROMV$MYSTATwhereROWNUM=1; SID ---------- 159 SQL>select*FROMV$LOCKwhereSID=159;
未选定行
SQL>createGLOBALTEMPORARYTABLET_TEMP 2(IDNUMBER) 3ONCOMMITPRESERVEROWS;
表已创建。
SQL>insertINTOT_TEMPVALUES(1);
已创建 1 行。
SQL>select*FROMV$LOCKwhereSID=159; ADDRKADDRSIDTYID1ID2LMODEREQUESTCTIMEBLOCK ---------------------------------------------------------------------------------------- 3303445033034464159TO5757313030 32B7DDF432B7DF10159TX13111558796030 SQL>COLOBJECT_NAMEFORMATA30 SQL>selectOWNER,OBJECT_NAME,OBJECT_TYPE 2FROMDBA_OBJECTSwhereOBJECT_ID=57573; OWNEROBJECT_NAMEOBJECT_TYPE --------------------------------------------------------------------------- YANGTKT_TEMPTABLE SQL>COMMIT;
提交完成。
SQL>select*FROMV$LOCKwhereSID=159; ADDRKADDRSIDTYID1ID2LMODEREQUESTCTIMEBLOCK ---------------------------------------------------------------------------------------- 3303445033034464159TO57573130510
可以看到,提交之后事务锁已经释放,但是临时表上的锁并没有释放,这就是为什么执行drop时会报错。
- ››oracle 恢复误删除的表和误更新的表
- ››Oracle分页查询排序数据重复问题
- ››Oracle创建dblink报错:ORA-01017、ORA-02063解决
- ››Oracle 提高SQL执行效率的方法
- ››Oracle 动态查询,EXECUTE IMMEDIATE select into...
- ››Oralce新建数据库、新建远程登录用户全过程
- ››Oracle 11g必须开启的服务及服务详细介绍
- ››oracle性能34条优化技巧
- ››oracle数据库生成随机数的函数
- ››Oracle 数据库表空间容量调整脚本
- ››oracle单库彻底删除干净的方法
- ››Oracle创建表空间、创建用户以及授权、查看权限
更多精彩
赞助商链接