ORA-01843: no es un mes válido en la aplicación Java

Tenemos una aplicación web Java implementada en SAP Netweaver que accede a una base de datos Oracle 10g a través de JDBC simple. La aplicación funcionaba bien hasta hace unos días, cuando una consulta estaba provocando el siguiente error:

ORA-01843: not a valid month

La consulta que nos está dando problemas es esta:

SELECT *
FROM   (SELECT *
        FROM   (SELECT inspeccion.sociedad_id,
                       inspeccion_id,
                       estado_id,
                       (SELECT des_estado
                        FROM   estado
                        WHERE  estado.estado_id = inspeccion.estado_id)
                       des_estado,
                       (SELECT numero_secuencia
                        FROM   estado
                        WHERE  estado.estado_id = inspeccion.estado_id)
                       numero_secuencia,
                       planta_id,
                       (SELECT des_planta
                        FROM   planta
                        WHERE  planta.planta_id = inspeccion.planta_id)
                       des_planta,
                       area_id,
                       (SELECT des_area
                        FROM   area
                        WHERE  area.area_id = inspeccion.area_id)       des_area
                       ,
                       igp_id,
                       '-'
                       nom_lider,
                       nom_inspector,
                       nom_responsable,
                       To_char(fecha_inspeccion, 'DD/MM/YYYY')
                       fecha_inspeccion,
                       observacion,
                       recomendacion
                FROM   inspeccion) inspeccion) t_inspeccion
WHERE  estado_id NOT IN ( 10 )
       AND t_inspeccion.estado_id IN ( 11, 12 )
       AND t_inspeccion.planta_id = 42
       AND t_inspeccion.fecha_inspeccion >= To_date('01/11/2010', 'dd/mm/yyyy')
       AND t_inspeccion.sociedad_id = '0101'
ORDER  BY t_inspeccion.numero_secuencia,
          t_inspeccion.fecha_inspeccion

Estábamos sospechando de la To_date('01/11/2010', 'dd/mm/yyyy') declaración, pero cuando ejecutamos la consulta a través de DBVisualizer no tenemos ningún problema.

Estoy un poco perdido aquí. ¿Tal vez hay una configuración de base de datos que está interfiriendo con la consulta, o alguna configuración de SAP Netweaver? ¿O tal vez algún problema con el controlador de Oracle?

preguntado el 03 de mayo de 12 a las 17:05

Que tipo de datos es fecha_inspeccion? Es inspeccion ¿una mesa o una vista? -

Inspeccion es una tabla y fecha_inspeccion tiene un tipo de dato DATE. -

1 Respuestas

En la selección anidada que se convierte en t_inspeccion tienes:

To_char(fecha_inspeccion, 'DD/MM/YYYY') fecha_inspeccion,

... y luego en el exterior where cláusula que tiene:

AND t_inspeccion.fecha_inspeccion >= To_date('01/11/2010', 'dd/mm/yyyy')

Asumiendo el original inspection.fecha_inspeccion es un date, parece que está convirtiendo a una cadena y luego está haciendo una conversión implícita a una fecha para compararla con su valor fijo. Sospecho que la conversión implícita de t_inspeccion.fecha_inspeccion está lanzando el error, posiblemente de un inesperado NLS_DATE_FORMAT ajuste; que en Java normalmente se obtiene de su configuración regional. Por el error, supongo que está usando implícitamente MM/DD/YYYY, pero fácilmente podría ser otra cosa.

No veo por qué tuviste la to_char() sin embargo, a menos que desee particularmente el formato de texto en los resultados; en cuyo caso debe volver a convertir explícitamente la fecha en el where cláusula:

AND To_date(t_inspeccion.fecha_inspeccion, 'dd/mm/yyyy')
    >= To_date('01/11/2010', 'dd/mm/yyyy')

... o extraiga también la columna de la fecha original y compárela; aunque eso tal vez necesite que enumere todas las otras columnas en la parte más externa select. Si está, o espera estar, usando un índice en fecha_inspeccion entonces también puede estar degradando el rendimiento al tratarlo como una cadena.

contestado el 03 de mayo de 12 a las 18:05

Aunque modifico explícitamente NLS_DATE_FORMAT, mi función Oracle devuelve este error. Finalmente copié algunos registros de Oracle de una máquina en ejecución a esa. Parece trabajado hasta ahora. Esperando no volver a encontrarnos. - Davut Gurbüz

Mi última prueba mencionada anteriormente no tuvo éxito. Descubrí que mi programa Java recupera la sesión de Oracle y la nueva sesión no tiene mi atributo NLS_DATE_FORMAT. Ahora, estoy volviendo a modificar NLS_DATE_FORMAT. Dios ayudanos ! - Davut Gurbüz

@DavutGürbüz: debe evitar confiar en NLS_DATE_FORMAT en absoluto. ¿Por qué no especificar simplemente una máscara de formato explícito cada vez que necesite convertir entre una fecha y una cadena? Y use una fecha nativa siempre que sea posible y durante el mayor tiempo posible. - alex poole

@AlexPoole acabo de llamar a una función de Oracle en java código En realidad en esta función hay sysdate insertar una tabla. El error regresa de esta función. Aunque pruebo esta función con PL-SQL developer y funciona perfectamente. La llamada java falla. La configuración regional de PC es EE. UU. y no puedo cambiarla por alguna razón. DB usa turco. dd.mm.YYYY pero EE.UU. usa mm.dd.YYYY. No puedo definir una máscara explícita para una llamada de función. - Davut Gurbüz

@DavutGürbüz: entonces es la función la que debe corregirse. Presumiblemente, está haciendo una conversión implícita entre una cadena y una fecha (por ejemplo, to_date(sysdate) lo cual es un error sorprendentemente común). Si no puede averiguar dónde está fallando, haga una nueva pregunta e incluya su código de función. - alex poole

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.