ORA-00600: Error en query Oracle 12c usando WITH

ORA-00600Hola, hoy queremos compartir un error ORA-00600 que nos ha surgido en un cliente que demuestra lo importante que es conocer las nuevas funcionalidades de la aplicación con la que trabajamos, en este caso la BBDD Oracle.

¿Cómo apareció el error ORA-00600?

En un entorno se hizo una migración de una BBDD de versión 11.2.0.1 a la última versión 12.2.0.1.

Después de realizar la migración, nos encontramos con un error ORA-00600 en una query. Esta query lleva utilizándose por la aplicación a la que da servicio la BBDD desde hace bastante tiempo.
El error que se obtuvo es:
ORA-00600: código de error interno, argumentos: [15815], [12], [10], [9], [], [], [], [], [], [], [], []

Examen de la query

La query está escrita utilizando la cláusula WITH, y su sintaxis es la siguiente:

WITH
SAWITH0 AS (select sum(T22.CARGA_DOC_ID) as c1,
TRUNC(T31.DAY) as c2
from
GRUPO_GR.TD_2_TIEMPO T31,
GRUPO_RH.TF_CC_ORI_EMPLE T22
where ( T31.DAY_ID = T22.DAY_ID )
group by T31.DAY_ID, TRUNC(T31.DAY)
having 0.0 < sum(T22.CARGA_DOC_ID))
select D1.c1 as c1 from ( select distinct D1.c2 as c1
from
SAWITH0 D1
order by c1 desc ) D1 where rownum <= 1

Después de realizar pruebas para buscar el por qué del error. Nos damos cuenta que el problema estaba en el uso de la claúsula WITH. Al utilizar su contenido en la claúsula FROM, la query funciona correctamente:

select D1.c1 as c1 from ( select distinct D1.c2 as c1
from
(select sum(T22.CARGA_DOC_ID) as c1, TRUNC(T31.DAY) as c2
from
GRUPO_GR.TD_2_TIEMPO T31,
GRUPO_RH.TF_CC_ORI_EMPLE T22
where ( T31.DAY_ID = T22.DAY_ID )
group by T31.DAY_ID, TRUNC(T31.DAY)
having 0.0 < sum(T22.CARGA_DOC_ID)
) D1
order by c1 desc ) D1 where rownum <= 1

No parece ser un problema de la versión. Las consultas con la claúsula WITH están permitidas desde al menos la versión 9i de Oracle.

Por supuesto, nos ponemos en contacto con Oracle por medio de la página de soporte, para resolver la duda que tenemos con el error, ya que estos errores ORA-00600 son los errores que menos documentados están y es difícil realizar el seguimiento y solución de los mismos.

Después de varios intercambios de información, se llega a la conclusión de que el problema es que el parámetro optimizer_features_enable continua con el valor 11.2.0.1 (versión antes del Upgrade) y no cambió con el upgrade a la versión actual de la BBDD (12.2.0.1).

Revisando la documentación de Oracle vemos que este parámetro habilita una serie de características del funcionamiento del optimizador, que cambian en cada versión, y está claro que hemos dado con una de ellas.Las características de cada versión se pueden comprobar en el siguiente link:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/OPTIMIZER_FEATURES_ENABLE.html#GUID-E193EC9E-B642-4C01-99EC-24E04AEA1A2C
Después de revisar esto, se cambia el parámetro a la nueva versión, pudiendo hacerse online, con la instrucción ALTER SYSTEM:

ALTER SYSTEM SET optimizer_features_enable='12.2.0.1' SCOPE=both

Y la query comienza a funcionar, devolviendo un resultado:

C1
----------------------
31/07/2018 00:00:00

Esperamos que os haya gustado, os dejamos nuestras entradas sobre Oracle por si también os son de utilidad.
Equipo de Base de datos

Si no quieres perderte ninguna de nuestras publicaciones, suscribete GPS Open Source News