一个11g上面的错误。
会话的cursor_sharing设置不为EXACT时,且GROUP BY操作中,聚集函数的参数是常量时,会引发这个bug。
下面通过一个简单的例子来再现问题:
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Solaris: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production
SQL> SELECT MAX(0), MAX(0) FROM DUAL GROUP BY DUMMY;
MAX(0) MAX(0)
---------- ----------
0 0
SQL> SHOW PARAMETER CURSOR_SHARING
NAME TYPE VALUE
------------------------------------ ---------------------- ----------------
cursor_sharing string EXACT
SQL> ALTER SESSION SET CURSOR_SHARING = SIMILAR;
会话已更改。
SQL> SELECT MAX(0), MAX(0) FROM DUAL GROUP BY DUMMY;
MAX(0) MAX(0)
---------- ----------
0 0
SQL> SELECT MIN(0), MIN(0) FROM DUAL GROUP BY DUMMY;
SELECT MIN(0), MIN(0) FROM DUAL GROUP BY DUMMY
*
第 1 行出现错误:
ORA-00600: 内部错误代码, 参数: [15851], [], [], [0x000000001], [
避免这个bug的方法就是将CURSOR_SHARING设置为EXACT。上面的例子展示了在EXACT的情况下,Oracle并不报错,而将会话的CURSOR_SHARING修改为SIMILAR,再分析新的SQL,就出现了这个600错误。
METALINK在文章Doc ID: Note:5757106.8中对这个bug进行了描述,Oracle在10.2.0.4、11.1.0.7和11.2中FIX了这个bug。