ORACLE 11g 使用ROWNUM完美解决ORA-00600:内部错误代码
?轉載自:https://blog.csdn.net/mchdba/article/details/69938675
1,ORA-00600:內部錯誤代碼
Oracle從11.2.0.1升級到11.2.0.4,開發人員報告說一個job運行失敗,調試有報錯信息,ORA-00600:內部錯誤代碼,參數:[rwoirw: check ret val],[],[],[],[],ORA-06512:…,如下圖所示:
查看這個2000行的包體,查看到454行代碼是一個create table as的很長的sql,?
?
2,官方的解決途徑不是最佳方案
是動態sql執行的,創建一個表出錯的問題,在11.2.0.1的version里面是ok的,到了11.2.0.4就出問題了,google了下,說是11.2.0.4的一個bug。
?
官方對該bug的描述如下,并提供了2種解決途徑:
Refrence:Bug 14275161 - ORA-600 [rwoirw:check ret val] on CTAS with predicate move around (Doc ID 14275161.8)
?
?
第一種是升級到12.1:
??--》這個剛升級完11.2.0.4再升級到12.1顯然不太合適,而且萬一到了12.1,又有新的bug出現,那就比較麻煩了。
第二種方法:通過設置隱含參數 _pred_move_around 為false來繞過該錯誤
??????????--》這個也嘗試過了,不行,存儲過程的動態sql里面,添加 altersystem set _pred_move_around =false;后報下面的錯誤出來:
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里面對create tablexxx as select …. From …的限制比較嚴格(或者也許就是真的一個bug?),意味著在不知道后面的select … from …的總體數量的情況下或者數量已經超過了oracle的默認值比如1000這樣,會提示ORA-00600的錯誤。按照這個思路我查詢出來select … from ..的總數量,在后面加上and rownum<100000;,再次執行存儲過程,哎,天降奇瑞,成功了。
?
然后再發散思維下,萬一下回select的總數量超過100000了呢,那咋辦,總不能每次都去select count(1) from …然后再create吧。按照測試的邊界值理論,一個最大值ok了,那我嘗試下最小值呢,用and rownum>-1;(因為有可能select 出來空記錄)呢?嘗試了下,存儲過程執行成功了,and rownum>-1
總結
以上是生活随笔為你收集整理的ORACLE 11g 使用ROWNUM完美解决ORA-00600:内部错误代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybaits二十二:一级缓存失效的几种
- 下一篇: jvm三:jvm参数