ORA-01843: no es un mes válido en la aplicación Java
Frecuentes
Visto 11,596 veces
0
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?
1 Respuestas
5
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 sql oracle jdbc oracle10g or haz tu propia pregunta.
Que tipo de datos es
fecha_inspeccion
? Esinspeccion
¿una mesa o una vista? - Justin CaveInspeccion es una tabla y fecha_inspeccion tiene un tipo de dato DATE. - Carlos Gavidia-Calderon