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

猜你喜欢

转载自blog.csdn.net/m0_37564426/article/details/89028694