Pregunta

Un poco de fondo primero. Mi empresa está evaluando si migraremos o no nuestra base de datos Informix a Oracle 10g. Tenemos varios programas ESQL / C. He corrido un poco a través del banco de trabajo de Oracle Migration y he estado en medio de algunas pruebas. Ahora me he dado cuenta de algunas cosas.

Primero, tenemos sentencias de SQL dinámico que no manejan valores nulos en absoluto. Por lo que he leído, tengo que modificar manualmente las consultas para utilizar la función nvl () o implementar variables indicadoras. ¿Alguien puede confirmar si son necesarias modificaciones manuales? Cuanto mejor sea la cantidad de cambios manuales que tengamos que realizar en nuestros programas ESQL / C convertidos, mejor.

En segundo lugar, tenemos varias consultas que extraen fechas de varias tablas, etc., y en Informix las fechas se tratan como tipo largo, el número de días desde el 31 de diciembre de 1899.

En Pro * C, ¿en qué formato se selecciona una fecha? Sé que no es numérico porque intenté seleccionar el campo de fecha en mi variable larga y obtengo el error de Oracle que indica "NÚMERO esperado", pero obtuve una FECHA " Así que asumo que tendremos que modificar la forma en que seleccionamos los campos de fecha, ya sea seleccionando un campo de fecha de manera convertida para que se convierta en un largo (es decir, # de días desde el 31/12/1899), o cambiemos el host variable para que coincida con lo que Oracle está devolviendo (¿qué es eso, cadena?).

¿Fue útil?

Solución

Para convertir las fechas de Oracle (que se almacenan en formato interno de Oracle) en un entero largo, deberá modificar sus consultas. Utilice la siguiente fórmula para sus fechas:

to_number (to_char (date_column, 'J')) - to_number(to_char(to_date('12/31/1899', 'MM/DD/YYYY'), 'J'))

El formato del sistema Oracle 'J' (para fecha juliana) es un recuento de días desde el 31 de diciembre de 4712 aC. Si desea contar desde una fecha posterior, deberá restar el recuento de días julianos de esa fecha posterior.

Una sugerencia: en lugar de alterar todas sus consultas en sus programas (que pueden crear problemas e introducir errores), cree un conjunto de vistas en un esquema diferente. Estas vistas tendrían el mismo nombre que todas las tablas, con todas las mismas columnas, pero incluyen las fórmulas NVL () y date () (como arriba). Luego apunte su aplicación al esquema de vista en lugar del esquema de tabla base. Mucho menos pruebas y menos lugares para perder algo.

Por ejemplo, coloque todas sus tablas en un esquema llamado " APPS_BASE " (definido por el usuario " APPS_BASE " ;. Luego cree otro esquema / usuario llamado " APPS_VIEWS " ;. En APPS_VIEWS cree una vista:

CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM   APPS_BASE.EMP;

Otros consejos

Ya. Deberá modificar sus consultas según lo descrito.

largo te está haciendo tropezar. Largo tiene un significado diferente en Oracle. Hay un tipo específico de FECHA. Generalmente cuando se selecciona uno, se utiliza la función TO_DATE con un formato, para obtener el resultado como un VARCHAR2, exactamente en el formato que desee.

Probablemente no lo haya alcanzado todavía, pero tenga en cuenta que en Oracle los campos VARCHAR2 vacíos son NULL. No veo ninguna lógica detrás de esto (probablemente porque vengo de Informix land), solo tenlo en cuenta. Creo que es estúpido: la cadena vacía de IMHO es significativa y diferente de NULL.

Modifique todos sus campos VARCHAR2 para que sean NOT NULL DEFAULT '-' o cualquier otro valor arbitrario, o use indicatores en TODAS sus consultas que devuelvan campos VARCHAR2, o siempre use NVL ( ) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top