2010-07-09 15 views
27

Noté la siguiente diferencia, pero no la vi documentada en ninguna parte. Me pregunto si otros han notado lo mismo o pueden señalarme algunos documentos que demuestren lo mismo.ojdbc14.jar vs. ojdbc6.jar

Env: -

Oracle 11g, JDK 1.6, iBatis, PL/SQL

Escenario: -

ojdbc14.jar: si PL/SQL devuelve una variable de tipo DATE y trato de poner eso en un java.sql . Variable de fecha, entonces todo funciona bien. Ejemplo:

Date annualDate = (Date) map.get("exam_date");

ojdbc6.jar: si PL/SQL devuelve una variable de tipo DATE y trato de poner esto en una variable java.sql.Date en cuando me siento una excepción:

java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date 
+0

¿No puedes llamar a getDate ('exam_date') en el result_set, y obtener una fecha apropiada y no una marca de tiempo? – bwawok

+0

Tengo un problema similar después de actualizar de ojdbc14 a ojdbc6. Realmente agradecería si alguien pudiera investigar este problema y darme una respuesta https://stackoverflow.com/questions/46543694/object-deserialization-failure-in-ojdbc14-to-ojdbc6-upgrade –

Respuesta

23

En realidad, ojdbc14.jar realmente no dice nada acerca de la versión real del conductor (ver JDBC Driver Downloads), excepto que es anterior a Oracle 11g. En tal situación, debe proporcionar la versión exacta.

De todos modos, creo que encontrarás alguna explicación en What is going on with DATE and TIMESTAMP? En resumen, cambiaron el comportamiento en los controladores 9.2 y nuevamente en los controladores 11.1.

Esto podría explicar las diferencias que está experimentando (y sugiero usar la versión más reciente, es decir, los controladores 11.2).

34

El "14" y "6" en esos nombres de controlador se refieren a la JVM para la que fueron escritos. Si todavía está utilizando JDK 1.4, diría que tiene un problema grave y necesita actualizarse. JDK 1.4 ya pasó su útil vida útil. ¡Ni siquiera tenía genéricos! JDK 6 u21 es el estándar de producción actual de Oracle/Sun. Recomiendo cambiar a él si no lo has hecho ya.

+0

Estoy usando jdk 1.6 – Omnipresent

+4

JDK 6 también ha llegado al final de su vida útil. El estándar actual es JDK 7. – duffymo

+0

@duffymo Dijo que 4 años antes, en ese momento tenía razón (lo digo al comienzo de la era java8). – peterh

9

Tengo el mismo problema!

Encontrado siguiente en el sitio de Oracle link text

Como se mencionó anteriormente, los conductores 11.1 por defecto FECHA convert SQL a marca de tiempo cuando se lee de la base de datos. Esto siempre fue lo correcto y el cambio en 9i fue un error. Los controladores 11.1 han vuelto al comportamiento correcto. Incluso si no configuró V8Compatible en su aplicación, no debería ver ninguna diferencia en el comportamiento en la mayoría de los casos. Puede notar una diferencia si usa getObject para leer una columna de FECHA. El resultado será una marca de tiempo en lugar de una fecha. Dado que Timestamp es una subclase de Date, esto generalmente no es un problema. Donde puede notar una diferencia es si confió en la conversión de FECHA en Fecha para truncar el componente de tiempo o si lo hace en el valor. De lo contrario, el cambio debería ser transparente.

Si por alguna razón su aplicación es muy sensible a este cambio y simplemente debe tener el comportamiento 9i-10g, existe una propiedad de conexión que puede establecer. Establezca mapDateToTimestamp en false y el controlador volverá al comportamiento 9i-10g predeterminado y asignará DATE a Date.

0

Asimismo, desde ojdbc14 a ojdbc6, varios tipos (por ejemplo, OracleResultSet, OracleStatement) se mudaron de paquete oracle.jdbc.driver-oracle.jdbc.