ORACLE 11g 使用ROWNUM完美解决ORA-00600:内部错误代码
?轉(zhuǎn)載自:https://blog.csdn.net/mchdba/article/details/69938675
1,ORA-00600:內(nèi)部錯(cuò)誤代碼
Oracle從11.2.0.1升級(jí)到11.2.0.4,開(kāi)發(fā)人員報(bào)告說(shuō)一個(gè)job運(yùn)行失敗,調(diào)試有報(bào)錯(cuò)信息,ORA-00600:內(nèi)部錯(cuò)誤代碼,參數(shù):[rwoirw: check ret val],[],[],[],[],ORA-06512:…,如下圖所示:
查看這個(gè)2000行的包體,查看到454行代碼是一個(gè)create table as的很長(zhǎng)的sql,?
?
2,官方的解決途徑不是最佳方案
是動(dòng)態(tài)sql執(zhí)行的,創(chuàng)建一個(gè)表出錯(cuò)的問(wèn)題,在11.2.0.1的version里面是ok的,到了11.2.0.4就出問(wèn)題了,google了下,說(shuō)是11.2.0.4的一個(gè)bug。
?
官方對(duì)該bug的描述如下,并提供了2種解決途徑:
Refrence:Bug 14275161 - ORA-600 [rwoirw:check ret val] on CTAS with predicate move around (Doc ID 14275161.8)
?
?
第一種是升級(jí)到12.1:
??--》這個(gè)剛升級(jí)完11.2.0.4再升級(jí)到12.1顯然不太合適,而且萬(wàn)一到了12.1,又有新的bug出現(xiàn),那就比較麻煩了。
第二種方法:通過(guò)設(shè)置隱含參數(shù) _pred_move_around 為false來(lái)繞過(guò)該錯(cuò)誤
??????????--》這個(gè)也嘗試過(guò)了,不行,存儲(chǔ)過(guò)程的動(dòng)態(tài)sql里面,添加 altersystem set _pred_move_around =false;后報(bào)下面的錯(cuò)誤出來(lái):
SQL> call PKG_ADS_AMP_PD.build(); call PKG_ADS_AMP_PD.build() ORA-04068: existing state of packages has been discarded ORA-04061: existing state of package body "DW.PKG_ADS_AMP_PD" has been invalidated ORA-04065: not executed, altered or dropped package body "DW.PKG_ADS_AMP_PD"SQL>
3,使用ROWNUM完美解決
??
思考了下,也許11.2.0.4里面對(duì)create tablexxx as select …. From …的限制比較嚴(yán)格(或者也許就是真的一個(gè)bug?),意味著在不知道后面的select … from …的總體數(shù)量的情況下或者數(shù)量已經(jīng)超過(guò)了oracle的默認(rèn)值比如1000這樣,會(huì)提示ORA-00600的錯(cuò)誤。按照這個(gè)思路我查詢出來(lái)select … from ..的總數(shù)量,在后面加上and rownum<100000;,再次執(zhí)行存儲(chǔ)過(guò)程,哎,天降奇瑞,成功了。
?
然后再發(fā)散思維下,萬(wàn)一下回select的總數(shù)量超過(guò)100000了呢,那咋辦,總不能每次都去select count(1) from …然后再create吧。按照測(cè)試的邊界值理論,一個(gè)最大值ok了,那我嘗試下最小值呢,用and rownum>-1;(因?yàn)橛锌赡躶elect 出來(lái)空記錄)呢?嘗試了下,存儲(chǔ)過(guò)程執(zhí)行成功了,and rownum>-1
總結(jié)
以上是生活随笔為你收集整理的ORACLE 11g 使用ROWNUM完美解决ORA-00600:内部错误代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mybaits二十二:一级缓存失效的几种
- 下一篇: jvm三:jvm参数