Referencia de problemas y patrones de conversión

Los espacios de trabajo de conversión agregan todos los problemas de conversión en grupos y categorías para ayudarte a planificar la corrección de errores y advertencias de conversión. Cada categoría representa el tipo de trabajo que puede que tengas que realizar para solucionar los problemas (revisar, refactorizar o ajustar los tipos de datos). Los grupos proporcionan una mayor agregación, ya que diferencian entre casos específicos en un nivel inferior:

Pantalla de resumen del espacio de trabajo Conversiones, en la que se muestran los grupos y las categorías de problemas de conversión.
Figura 1. Pantalla de resumen del espacio de trabajo Conversiones con grupos y categorías de problemas de conversión.
Pantalla de resumen del espacio de trabajo Conversiones, en la que se muestran los grupos y las categorías de problemas de conversión.

En la siguiente tabla se indican todos los grupos de problemas de conversión que pueden surgir durante la conversión de esquemas:

ID de grupo de problemas Descripción

Código fuente no válido

Posible causa principal

Los errores de este grupo suelen producirse cuando el servicio de migración de bases de datos detecta una sintaxis desconocida o cuando el código fuente de Oracle no es válido (por ejemplo, falta la palabra clave END; en un procedimiento almacenado).

Posible mitigación

Corrija los objetos no válidos en la base de datos de Oracle de origen. A continuación, actualiza la instantánea del esquema de origen en Database Migration Service y vuelve a intentar el proceso de conversión del esquema. También puedes excluir el objeto de la migración.

Faltan objetos de referencia

Posible causa principal

Database Migration Service usa los metadatos de los objetos del árbol de origen para mejorar la calidad de la conversión de código de los objetos dependientes. Si tu código hace referencia a objetos que no están incluidos en el esquema de origen, es posible que tengas problemas de conversión porque Database Migration Service no puede determinar la estructura ni los tipos de datos de las columnas, los atributos o los objetos a los que se hace referencia y que faltan.

Entre los posibles errores de este grupo se incluyen los tipos de datos incorrectos para los tipos definidos por el usuario (UDTs) o los tipos de datos VARCHAR predeterminados para columnas, parámetros o variables.

Posible mitigación

Asegúrate de que todos los objetos a los que se hace referencia se añadan al árbol de origen de Database Migration Service o ajusta manualmente el código de PostgreSQL en función de tu conocimiento del modelo de datos de origen de las dependencias que faltan.

Tablas sin clave principal

Posible causa principal

Database Migration Service requiere que todas las tablas tengan una clave principal. En el caso de las tablas sin claves primarias, Database Migration Service añade una columna NUMERIC llamada rowid a la tabla de PostgreSQL de destino. Esta columna se rellena con los valores numéricos correspondientes de la pseudocolumna ROWID de Oracle de origen. Para asegurarse de que las instrucciones INSERT no fallen después de la migración, Database Migration Service crea una secuencia y la usa para incrementar automáticamente la columna rowid.

Posible mitigación

Puedes conservar o eliminar la columna rowid después de la migración.

Funciones integradas de Oracle no admitidas

Posible causa principal

Puede que estés usando una función integrada de Oracle que no sea compatible.

Posible mitigación

Busca una función similar en PostgreSQL y modifica el código convertido en consecuencia. En algunos casos, la función que falta se puede proporcionar mediante la extensión Orafce, disponible para las migraciones de Cloud SQL para PostgreSQL y AlloyDB para PostgreSQL.

SQLCODE aún no disponible

Posible causa principal

La función SQLCODE de Oracle no se admite para la conversión. SQLCODE devuelve un INTEGER, mientras que el equivalente más cercano en PostgreSQL es la función SQLSTATE que devuelve valores TEXT.

Posible mitigación

Si tu código fuente no depende de que SQLCODE devuelva un entero (por ejemplo, SQLCODE solo se registra en una columna VARCHAR2 o con un mensaje DBMS_OUTPUT), SQLSTATE se puede usar de forma segura en el código de PostgreSQL.

Si tu código fuente depende de que SQLCODE devuelva un número entero (por ejemplo, si lo usas con las variables NUMBER o INTEGER, o si guardas los valores devueltos de SQLCODE como parámetros o columnas), debes refactorizar el código convertido.

Función de SQL de Oracle aún no admitida

Posible causa principal

Database Migration Service no admite algunas funciones integradas de Oracle para la conversión.

Algunas funciones pueden tener sus equivalentes en PostgreSQL (por ejemplo, ASCII), mientras que otras pueden compartir el mismo nombre, pero tener especificaciones diferentes (por ejemplo, las funciones REGEXP%). Puede que algunas funciones no existan.

Posible mitigación

Inspecciona qué función de Oracle ha generado el error.

  • Si la función existe con el mismo comportamiento en PostgreSQL, puedes ignorar el mensaje de error, ya que el código convertido debería funcionar igual después de la migración.
  • Si una función tiene el mismo nombre, pero funciona de forma diferente o no existe en PostgreSQL, puedes intentar corregir el código convertido:

    • Crea una función definida por el usuario (UDF) con el mismo nombre en la base de datos de destino.
    • Sustituye la llamada de función en el origen por una expresión equivalente.
    • Usar la asistencia para la conversión mejorada con Gemini. Para obtener más información, consulta el artículo Convertir código y esquemas de SQL Server con la asistencia de Gemini.

    • Algunas funciones o características de la base de datos Oracle se pueden replicar con extensiones, como Orafce. Para obtener más información sobre las extensiones admitidas en tu base de datos de destino, consulta Extensiones de base de datos admitidas.

No se admiten por completo los paquetes integrados de Oracle

Posible causa principal

Database Migration Service admite determinados paquetes integrados de Oracle, pero muchos no tienen compatibilidad total con la conversión, como DBMS_STATS, DBMS_UTILITY o DBMS_SQL.

Posible mitigación

Si usas algún paquete no compatible, es posible que tengas que hacer lo siguiente:

  • Cambia tu código. Por ejemplo, en lugar de usar DBMS_STATS.GATHER_TABLE_STATS, puedes usar un comando más sencillo, como ANALYZE.

    Es posible que sea necesario refactorizar paquetes como UTL_FILE y DBMS_AQ, ya que no se pueden replicar fácilmente en PostgreSQL.

  • Algunas funciones o características de la base de datos Oracle se pueden replicar con extensiones, como Orafce. Para obtener más información sobre las extensiones admitidas en la base de datos de destino, consulta Extensiones de base de datos admitidas.

Tipo de datos de Oracle aún no admitido para la conversión

Posible causa principal

Actualmente, no se admiten algunos tipos de datos de Oracle para la conversión o la transferencia de datos.

Posible mitigación

En la mayoría de los casos, PostgreSQL tiene un tipo de datos equivalente. Puedes usar archivos de asignación de conversiones para personalizar la lógica de conversión y transformar el tipo de datos de Oracle no admitido en el tipo de datos de PostgreSQL requerido.

Para obtener más información sobre la compatibilidad con los tipos de datos, consulta el artículo Espacios de trabajo de conversión: descripción general y objetos admitidos.

Función de origen aún no admitida

Posible causa principal

Este grupo incluye todos los problemas genéricos relacionados con las funciones de Oracle que no se admiten en la conversión. Los problemas de este grupo no se incluyen en ningún otro grupo de problemas más específico.

Posible mitigación

Tipo de objeto de esquema no admitido

Posible causa principal

Database Migration Service no admite determinados tipos de objetos de esquema de Oracle para la conversión de código porque PostgreSQL no tiene equivalentes adecuados. Por ejemplo, las tablas organizadas por índice (IOTs), los índices de búsqueda de texto o los cuerpos de los tipos definidos por el usuario (UDTs).

Posible mitigación

Database Migration Service convierte los objetos no admitidos en el equivalente de PostgreSQL más parecido. Por ejemplo, las IOTs se convierten en tablas normales con una restricción de clave principal, y los índices de búsqueda de texto se convierten en índices de árbol B. Ten en cuenta que estas conversiones pueden provocar la pérdida de funciones específicas del tipo de objeto original.

Función de PL/SQL aún no disponible

Posible causa principal

Este grupo recoge todos los problemas genéricos relacionados con las funciones de PL/SQL que no se admiten para la conversión. Los problemas de este grupo no se incluyen en ningún otro grupo de problemas más específico.

Posible mitigación

Aún no se admite la vinculación en bloque

Posible causa principal

Actualmente, la conversión de código de Database Migration Service no admite funciones de enlace masivo de Oracle, como BULK COLLECT, FORALL o SAVE EXCEPTIONS.

Posible mitigación

Para solucionar el problema, debe modificar el código que usa las funciones de vinculación masiva. Te recomendamos que tengas en cuenta las diferencias entre la arquitectura de PostgreSQL y la de Oracle, así como si es necesario procesar arrays en PostgreSQL para tu caso práctico.

Hay varias estrategias para abordar las operaciones de enlace masivo de Oracle en PostgreSQL. Su uso depende de tu situación concreta, por lo que te recomendamos que utilices la asistencia para la conversión basada en Gemini para satisfacer tus necesidades específicas. Aquí tienes otras recomendaciones de ejemplo para ayudarte a dar los primeros pasos:

  • Para obtener un BULK COLLECT completo (sin LIMIT), puedes probar a usar la función ARRAY_AGG.
  • En el caso de BULK COLLECT con LIMIT, puedes probar a usar un CURSOR FOR LOOP para cargar y procesar lotes de filas en arrays. Sin embargo, si tu caso permite cambios funcionales, una alternativa posiblemente más sencilla sería usar CURSOR FOR LOOP para procesar las filas de una en una (en lugar de cargarlas en arrays).
  • Para las operaciones FORALL, puedes probar el DML basado en conjuntos con UNNEST si decides usar el procesamiento de arrays.
  • En SAVE EXCEPTIONS, puede que tengas que escribir un controlador de excepciones en un CURSOR FOR LOOP basado en filas, ya que no hay ninguna cláusula equivalente en PostgreSQL.

Colecciones aún no está disponible

Posible causa principal

La conversión de código de Database Migration Service admite parcialmente las colecciones de Oracle.

Posible mitigación

Debe modificar el código de PostgreSQL convertido en consecuencia. Cuando resuelvas problemas con colecciones, recuerda que las matrices de PostgreSQL nunca son dispersas. Si asignas elementos de forma dispersa, es posible que las matrices de PostgreSQL devuelvan resultados y recuentos de cardinalidad distintos a los de las matrices de Oracle.

Como PostgreSQL no admite arrays indexados por cadenas, en función de la naturaleza de los datos, puede que te resulten adecuados JSON/JSONB o las extensiones hstore.

Funciones de canalización aún no admitidas

Posible causa principal

Database Migration Service no admite funciones de canalización.

Posible mitigación

Puedes sustituir las funciones de canalización de Oracle por funciones que devuelvan conjuntos de PostgreSQL. Te recomendamos que ajustes el código de forma que se adapte a tu caso práctico. Aquí tienes algunos ejemplos para ayudarte a dar los primeros pasos:

  1. Hacer referencia al tipo de PostgreSQL (UDT) que se convierte del objeto de Oracle de origen o del tipo de registro que define el tipo de fila de la función de canalización. A continuación, modifica la cláusula de retorno de la función de PostgreSQL para que sea RETURNS SETOF <type name> o RETURNS TABLE, según tu caso concreto.

  2. Sustituye el valor devuelto en el código PIPE ROW convertido por RETURN NEXT <row or record variable>.

El tipo de colección de la función de origen en la canalización, que se usa en la cláusula RETURN de la función Oracle, no es necesario en PostgreSQL.

Opción de SQL dinámico aún no disponible

Posible causa principal

Database Migration Service ofrece compatibilidad parcial con la conversión de SQL dinámico. Las palabras clave de Oracle EXECUTE IMMEDIATE, OPEN FOR y USING/INTO se convierten correctamente a sus equivalentes de PostgreSQL, pero las cadenas de SQL dinámico, DML o DDL no se convierten.

Posible mitigación

Debes modificar el código convertido para que se ajuste a tus requisitos. Te recomendamos que uses la asistencia para la conversión basada en Gemini para gestionar el SQL dinámico.

La opción CONNECT BY aún no está disponible

Posible causa principal

Database Migration Service admite la mayoría de los CONNECT BY operadores, funciones y pseudocolumnas, que se convierten en expresiones de tabla comunes recursivas (CTEs) de PostgreSQL. Sin embargo, hay ciertas excepciones que pueden requerir tu atención. Por ejemplo, la cláusula ORDER SIBLINGS BY solo se admite en orden ascendente.

Posible mitigación

No es posible replicar la cláusula ORDER SIBLINGS BY para el orden descendente de forma sencilla, por lo que es posible que tengas que reestructurar el código para que funcione con el orden ascendente.

Revisa los problemas notificados con los operadores de CONNECT BY y ajusta el código donde sea necesario. Te recomendamos que pruebes las funciones de conversión automática basadas en Gemini para acelerar estas correcciones. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

JSON aún no es compatible

Posible causa principal

Database Migration Service tiene ciertas limitaciones en cuanto a la compatibilidad con JSON para el movimiento de datos y la conversión de código:

  • JSONB no se admite para la transferencia de datos.
  • La conversión de código no admite las funciones ni los operadores de consulta JSON en Oracle (como JSON_TABLE, JSON_QUERY, JSON_OBJECT[AGG], JSON_ARRAYAGG y JSON_PATCH).
  • En las versiones de Oracle anteriores a 21c, puedes almacenar datos de JSON en columnas VARCHAR2, CLOB o BLOB, y verificarlos con la condición IS JSON. Database Migration Service no admite la conversión de esta condición.
Posible mitigación
  • Para mover datos JSON almacenados en columnas VARCHAR2, CLOB o BLOB a PostgreSQL, puede que tengas que escribir un archivo de asignación de conversión con la directiva MODIFY_TYPE.

    Por ejemplo:

    MODIFY_TYPE SOURCE_TABLE_NAME:BLOB_COLUMN_NAME_WITH_JSON_DATA:JSON

    Para obtener más información sobre los archivos de asignación de conversiones, consulte el artículo Archivos de asignación de conversiones.

  • Para convertir las funciones y los operadores de Oracle JSON a PostgreSQL, puedes usar funciones de PostgreSQL como JSONB_ARRAY_ELEMENTS y JSON_AGG. Para obtener más información, consulta Funciones y operadores JSON en la documentación de PostgreSQL.

Problemas con el bloqueo y las transacciones

Posible causa principal

La conversión de código de Database Migration Service no admite las instrucciones LOCK ni SAVEPOINT. PostgreSQL no admite SAVEPOINT.

Posible mitigación
  • Divide los bloques SAVEPOINT de Oracle en bloques de transacciones independientes en PostgreSQL que utilicen la instrucción ROLLBACK.
  • Para implementar DBMS_LOCK, usa la extensión PostgreSQL pg_dbms_lock. Esta extensión simplifica la migración de los bloqueos definidos por el usuario de Oracle a PostgreSQL emulando la funcionalidad del paquete DBMS_LOCK de Oracle.

XML aún no admitido

Posible causa principal

Database Migration Service no admite Oracle XMLTYPE ni las funciones y los operadores XML asociados.

Posible mitigación

Aunque Database Migration Service no admite directamente XMLTYPE, puedes personalizar las columnas BLOB, CLOB, NVARCHAR2 o VARCHAR2 a XML para mover datos. PostgreSQL admite la funcionalidad XML.

Para migrar tus datos XML, sigue estos pasos:

  1. Crea un archivo de asignación de conversiones con la directiva MODIFY_TYPE para datos XML. Por ejemplo:

    MODIFY_TYPE SOURCE_TABLE_NAME:BLOB_COLUMN_NAME_WITH_XML_DATA:XML

    Para obtener más información sobre los archivos de asignación de conversiones, consulte el artículo Archivos de asignación de conversiones.

  2. Inicia la tarea de migración. Este proceso migra todos los datos de Oracle a PostgreSQL, excepto los datos de las columnas de tipo XMLTYPE. Estas columnas se rellenan con valores NULL en PostgreSQL.t
  3. Crea una tabla externa en PostgreSQL seleccionando solo la columna XMLTYPE de Oracle. Incluye la columna de clave principal de la tabla de origen.
  4. Combina los datos XML de la tabla externa con la tabla PostgreSQL original.

Para obtener más información sobre cómo funciona PostgreSQL con XMLTYPE, consulta Funciones XML en la documentación de PostgreSQL.

PIVOT aún no disponible

Posible causa principal

Database Migration Service no admite los operadores de transposición PIVOT y UNPIVOT para la conversión de código.

Posible mitigación

Puedes conseguir la PIVOTtransposición en PostgreSQL usando la extensión tablefunc o reescribiendo la expresión de origen PIVOT en agregaciones condicionales. Por ejemplo:

  • SUM(CASE WHEN <condition> THEN <value> ELSE 0 END)
  • COUNT(CASE WHEN <condition> THEN 1 END)

Puedes crear UNPIVOT transposiciones, que crean pares clave-valor a partir de un conjunto de columnas, en PostgreSQL de varias formas:

  • Combinación de una LATERAL con un conjunto de VALUES. Por ejemplo: SELECT ... FROM <table> CROSS JOIN LATERAL (VALUES ('<column1-name>', <column1>), ('<column2-name>', <column2>) AS u(column_name, column_value))
  • Usar UNNEST con ARRAYs. Por ejemplo: SELECT ..., UNNEST(ARRAY['<column1-name>', '<column2-name>']) AS column_name, UNNEST(ARRAY[column1, column2]) AS column_value FROM <table>

Opción de ALTER aún no disponible

Posible causa principal

Database Migration Service no convierte las instrucciones ALTER (que a menudo se ejecutan en SQL dinámico).

Posible mitigación

Sustituye las instrucciones ALTER de Oracle por el comando SET en PostgreSQL. Te recomendamos que pruebes las funciones de conversión automática basadas en Gemini para acelerar estas correcciones. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

Función de SQL aún no disponible

Posible causa principal

Este grupo incluye todos los problemas genéricos relacionados con las funciones de SQL que no se admiten en la conversión. Los problemas de este grupo no se incluyen en ningún otro grupo de problemas más específico. Por ejemplo, se incluyen los activadores de eventos de bases de datos, las instrucciones GRANT, las operaciones INSERT de varias tablas, las instrucciones DML en vistas insertadas (INSERT INTO (SELECT ... FROM ...)) y las vistas laterales.

Posible mitigación

Sintaxis no admitida

Posible causa principal

Este grupo incluye todos los problemas genéricos relacionados con la sintaxis de Oracle SQL o PL/SQL no admitida. Los problemas de este grupo no se incluyen en ningún otro grupo de problemas más específico.

Posible mitigación

Cambia el código para usar la sintaxis de PostgreSQL que sea funcionalmente equivalente. Te recomendamos que explores las funciones de conversión automática basadas en Gemini para ajustar el código. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

Sintaxis de SQL no admitida

Posible causa principal

El código fuente usa sintaxis o elementos SQL que no son compatibles con Database Migration Service. Por ejemplo, no se admite el parámetro NLS_LANG en la función TO_DATE de Oracle.

Posible mitigación
Sintaxis de PL/SQL no admitida

Posible causa principal

Tu código fuente usa sintaxis o elementos de PL/SQL que no son compatibles con Database Migration Service. Por ejemplo, no se admiten las instrucciones INSERT basadas en registros (como INSERT INTO table VALUES r_variable) y PRAGMA RESTRICT_REFERENCES.

Posible mitigación

Cambia el código para usar la sintaxis de PostgreSQL que sea funcionalmente equivalente. Te recomendamos que explores las funciones de conversión automática basadas en Gemini para ajustar el código. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

Sintaxis de fecha y marca de tiempo no admitida

Posible causa principal

Database Migration Service puede generar errores o advertencias si la sintaxis, las operaciones o las expresiones de fecha o de marca de tiempo no son compatibles. Algunos ejemplos de estos problemas son las comparaciones entre tipos de datos que no coinciden o el uso del modelo de formato TZH:TZM en marcas de tiempo. Para obtener más información sobre los objetos y tipos de datos admitidos, consulta el artículo Acerca de los espacios de trabajo de conversión.

Posible mitigación

Puedes volver a crear la mayoría de las expresiones de fecha y marca de tiempo con los equivalentes de PostgreSQL. Te recomendamos que pruebes las funciones de conversión automática basadas en Gemini para acelerar estas correcciones. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

Elementos no admitidos de la sintaxis de gestión de excepciones de Oracle

Posible causa principal

La conversión de código de Database Migration Service no admite los siguientes elementos de sintaxis de excepción de Oracle PL/SQL:

  • El uso de RAISE_APPLICATION_ERROR con códigos de error variables en lugar de literales -20nnn.
  • El uso de SQLERRM con un argumento de código de error, ya que esta sintaxis no se admite en PostgreSQL.
Posible mitigación

Debe resolver estos problemas manualmente en el código convertido. Te recomendamos que pruebes las funciones de conversión automática basadas en Gemini para acelerar estas correcciones. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

Tipos de datos y problemas de conversión

Posible causa principal

Database Migration Service puede agrupar los problemas de conversión según el contexto (por ejemplo, problemas de conversión que se producen en expresiones de comparación de tipos). El grupo CW_OP0500 recoge todos los problemas genéricos de conversión de tipo de datos que no se incluyen en otros grupos de problemas.

Posible mitigación

En la mayoría de los casos, Database Migration Service emite un mensaje ERROR_UNIMPLEMENTED o ERROR_TYPE en el código de PostgreSQL convertido. Resuelve este error en función de tus conocimientos sobre los tipos de datos implicados.

Problemas con la máscara de formato de fecha

Posible causa principal

Es posible que se produzcan advertencias o problemas al convertir expresiones de fecha o de marca de tiempo en cadenas o viceversa en función de un modelo de formato. Database Migration Service usa un modelo predeterminado (actualmente DD-MON-RR) cuando las conversiones del código fuente de Oracle excluyen un modelo de formato de fecha o de marca de tiempo explícito.

A veces, esto puede provocar problemas en el código convertido si el modelo de formato emitido para la conversión implícita entra en conflicto con un modelo de formato explícito en la misma expresión. También puede que se produzca este problema si es probable que los datos se vean afectados por las diferencias entre el formato de Oracle RR y el formato de PostgreSQLYY.

Posible mitigación

Revisa y valida las expresiones de PostgreSQL convertidas en el espacio de trabajo de conversión.

Problemas con la máscara de formato numérico

Posible causa principal

Database Migration Service no admite todos los modelos de formato de Oracle. Por ejemplo, no se admiten 'L' ni 'X'. Es posible que se produzcan problemas o advertencias con el código que convierte cadenas en números según los modelos de formato de Oracle.

Posible mitigación

En el caso de los modelos de formato de Oracle que no tienen un equivalente en PostgreSQL, es posible que tengas que refactorizar tus expresiones o modelos de formato. Te recomendamos que pruebes las funciones de conversión automática basadas en Gemini para acelerar estas correcciones. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

Problemas de conversión de tipos de datos

Posible causa principal

Es posible que se produzcan errores debido a la conversión de tipos de datos no admitidos o imprecisos. Database Migration Service suele emitir ERROR_UNIMPLEMENTED. Esto suele deberse a que faltan metadatos o a que están incompletos. Es posible que el servicio de migración de bases de datos no tenga suficiente información para convertir un tipo, por ejemplo, en argumentos de funciones o parámetros de procedimientos.

Posible mitigación

Ajusta el código de PostgreSQL para asegurarte de que los tipos de datos se convierten correctamente. Para hacer estas correcciones, debe conocer los atributos, las variables y las columnas a los que hace referencia.

Problemas de comparación

Posible causa principal

Es posible que Database Migration Service no tenga suficientes metadatos o información sobre los tipos de datos al convertir expresiones de comparación de datos. Por ejemplo, esto puede ocurrir cuando se compara un tipo definido por el usuario (TDU) con NULL.

Posible mitigación

Revisa las expresiones de PostgreSQL convertidas y soluciona los problemas. Te recomendamos que pruebes las funciones de conversión automática basadas en Gemini para acelerar estas correcciones. Para obtener más información, consulta el artículo Convertir código y esquemas de Oracle con la asistencia de Gemini.

Los problemas de esta categoría representan casos en los que el código fuente de Oracle se convierte correctamente al equivalente más cercano de PostgreSQL, pero el código resultante puede tener pequeñas diferencias semánticas o funcionales que requieren que lo revises. Esto ocurre debido a las diferencias en la forma en que Oracle y PostgreSQL gestionan los tipos de datos, los formatos o los objetos.

A primera vista, esta categoría puede parecer que se solapa con los problemas de la categoría Tipos de datos y conversión (CW_05), pero ten en cuenta que representan problemas diferentes. CW_05 contiene problemas conocidos en los que Database Migration Service no puede convertir código de Oracle a su equivalente en PostgreSQL.

Revisar la máscara de formato de fecha

Posible causa principal

La mayoría de los modelos de formato de fecha y marca de tiempo de Oracle tienen equivalentes adecuados en PostgreSQL, por lo que el código convertido no tiene diferencias semánticas ni funcionales. Algunos modelos no tienen una coincidencia exacta y su comportamiento varía. Un ejemplo es el formato Oracle RR, que se convierte al formato PostgreSQL YY.

Posible mitigación

Revisa y valida las expresiones con conversiones de modelos de formato para asegurarte de que el código convertido se comporta como es debido.

Revisar la máscara de formato numérico

Posible causa principal

La mayoría de los modelos de formato numérico de origen tienen un equivalente en PostgreSQL, por lo que el código convertido no tiene diferencias semánticas ni funcionales. Sin embargo, es posible que algunos modelos de formato no tengan una coincidencia exacta o que se comporten de forma ligeramente diferente.

Posible mitigación

Revisa y valida las expresiones con conversiones de modelos de formato para asegurarte de que el código convertido funciona correctamente.

Revisar el código de excepción

Posible causa principal

Cuando usas RAISE_APPLICATION_ERROR con un código de error comprendido entre -20000 y -20999, Database Migration Service lo convierte a PostgreSQL RAISE EXCEPTION con un SQLSTATE comprendido entre CW0000 y CW999. La conversión conserva los tres últimos dígitos del código de error de origen y les añade el prefijo CW.

Posible mitigación

Revisa este comportamiento para determinar si se ajusta a tus necesidades. Esta revisión solo es necesaria si los códigos de error de origen son significativos para tu aplicación, tus equipos de asistencia o tu documentación. Si el valor del código de error no es significativo, puedes ignorar esta advertencia.

Revisar el mensaje de excepción

Posible causa principal

La función SQLERRM existe tanto en Oracle PL/SQL como en PostgreSQL, pero puede devolver un texto de error diferente en cada motor. Por ejemplo, al dividir entre cero en Oracle se devuelve el texto de error ORA-01476: divisor is equal to zero, pero ERROR: division by zero en PostgreSQL.

Posible mitigación

Si tu aplicación, infraestructura de asistencia o documentación dependen del texto del error, revisa la conversión. De lo contrario, puedes ignorar esta diferencia.

Revisar la emulación de funciones integradas de Oracle

Posible causa principal

La conversión de código y esquemas de Database Migration Service tiene como objetivo proporcionar el comportamiento de las funciones de Oracle con equivalentes de PostgreSQL, pero es posible que los resultados no siempre sean satisfactorios para tu situación. Por lo tanto, los espacios de trabajo de conversión siempre muestran una advertencia informativa con las conversiones de funciones que pueden requerir tu revisión.

Posible mitigación

Te recomendamos que revises los objetos en los que los espacios de trabajo de conversión emiten advertencias en el grupo de problemas CW_OP0605.

Revisar el tipo de datos de la columna de clave externa

Posible causa principal

El servicio de migración de bases de datos ha detectado especificaciones de tipo de datos que no coinciden entre objetos principales y secundarios (por ejemplo, cuando una columna principal es NUMBER(4) y la columna secundaria es NUMBER(10)).

Posible mitigación

La mayoría de las veces, las pequeñas discrepancias en los tipos de datos no causan problemas en la funcionalidad de la base de datos. Sin embargo, te recomendamos que revises el modelo de datos convertido para detectar incoherencias.

Se recomienda una revisión funcional
Posible causa principal

Este grupo incluye todos los problemas genéricos relacionados con posibles diferencias funcionales en el código de Oracle y PostgreSQL. Los problemas de este grupo no se incluyen en ningún otro grupo de problemas más específico.

Posible mitigación

Revisar la emulación de funciones integradas de Oracle

Posible causa principal

Muchas funciones integradas de Oracle no tienen un equivalente directo en PostgreSQL. Para ayudar a mitigar este problema en las migraciones, Database Migration Service convierte el código mediante diferentes expresiones SQL para producir un comportamiento funcional equivalente en PostgreSQL.

En algunos casos, las expresiones convertidas pueden ser complejas. Database Migration Service emite advertencias en el grupo CW_OP0702 para destacar posibles problemas y avisar de que se ha emulado una función con una expresión.

Posible mitigación

Revisa el código convertido para asegurarte de que las funciones convertidas se comportan como esperas en tu entorno de PostgreSQL.

Se requiere refactorización de transacciones autónomas

Posible causa principal

PostgreSQL no admite transacciones autónomas.

Posible mitigación

Puedes conseguir transacciones autónomas en PostgreSQL usando la extensión dblink, pg_background, o PL/Proxy. Las llamadas a la base de datos realizadas con cualquiera de estas extensiones se ejecutan en una sesión diferente y, por lo tanto, generan una transacción autónoma.

Refactorización de enlaces de bases de datos necesaria

Posible causa principal

Database Migration Service no admite enlaces de bases de datos de Oracle. Los objetos que usan enlaces requieren refactorización.

Posible mitigación

En función del destino del enlace de tu base de datos, puedes implementar una función equivalente en PostgreSQL con extensiones de base de datos, como dblink, postgres_fdw, oracle_fdw, o PL/Proxy.

Se requiere refactorización avanzada de las colas

Posible causa principal

Los paquetes de colas avanzadas de Oracle (DBMS_AQ y DBMS_AQADM) no tienen equivalentes en PostgreSQL y requieren refactorización.

Posible mitigación

Dispone de estas opciones:

  • Refactoriza la funcionalidad de colas para que no esté en la base de datos y se encuentre en el nivel de aplicación.
  • Usa tablas, alertas y activadores de PostgreSQL para implementar un comportamiento equivalente.
  • Ponte en contacto con tu representante del equipo de soluciones técnicas para obtener más ayuda.

Se requiere refactorización del correo de la base de datos

Posible causa principal

AlloyDB para PostgreSQL no admite el envío de correos directamente desde la base de datos. Tampoco se admiten las extensiones que habilitan esta función. Por lo tanto, Database Migration Service no convierte los usos del paquete UTL_SMTP.

Posible mitigación

Refactoriza el código de correo de tu base de datos y delega la responsabilidad de enviar correos a la capa de aplicación. Puedes seguir usando la base de datos para registrar las condiciones en las que es necesario enviar un correo.

Por ejemplo, se podrían escribir los detalles de los correos en una tabla específica. Esta tabla también puede actuar como una cola de correo electrónico que puedes sondear con una función de Cloud Run Functions y gestionar el procesamiento real de SMTP.

Se requiere refactorización de tareas y programación

Posible causa principal

Los paquetes de Oracle DBMS_JOB y DBMS_SCHEDULER no se convierten con Database Migration Service. Debes refactorizar el código que hace referencia a estos paquetes.

Posible mitigación

En el caso de los trabajos sencillos que no tienen dependencias, puedes crear manualmente trabajos programados en la base de datos PostgreSQL de destino con la extensión pg_cron.

Para las programaciones más complejas que pg_cron no admite, es posible que tengas que usar un programador de nivel de aplicación o de terceros.

Se requiere refactorización de E/S de archivos

Posible causa principal

Database Migration Service no admite el paquete Oracle UTL_FILE. Debes refactorizar el código que hace referencia a estos paquetes.

La extensión Orafce incluye la emulación de UTL_FILE, pero es posible que no funcione en un entorno PostgreSQL gestionado por Google debido a las funciones de E/S de archivos restringidas.

Posible mitigación
  • Refactoriza el código para eliminar las dependencias de UTL_FILE.
  • AlloyDB para PostgreSQL tiene ciertas restricciones en las funciones de E/S de archivos, por lo que no es posible implementar este comportamiento directamente en la base de datos de destino.

    Otra alternativa podría ser instalar PostgreSQL con la extensión orafce en una VM de Compute Engine de tu VPC. A continuación, puedes usar la extensión PL/Proxy en la base de datos de destino para llamar a la versión UTL_FILE compatible con PostgreSQL que se ejecuta en la base de datos de la VM de Compute Engine.

Sinónimos

Posible causa principal

PostgreSQL no admite sinónimos. En el caso de los objetos de código, Database Migration Service sustituye automáticamente las referencias de sinónimos por el esquema de origen y el nombre del objeto. Si usa sinónimos fuera de los objetos de código (por ejemplo, en esquemas de solo lectura para usuarios de aplicaciones de bases de datos), debe convertirlos manualmente.

Posible mitigación

Para usar sinónimos fuera de los objetos de código, puedes usar el parámetro SEARCH_PATH de PostgreSQL o refactorizar el código para usar vistas en los objetos de consulta.

Tablas temporales globales

Posible causa principal

Este grupo de problemas es una advertencia que indica que Database Migration Service ha detectado una tabla temporal global en el código fuente de Oracle. Para migrar tablas temporales globales, debes tener instalada y creada la extensión pgtt de PostgreSQL en la base de datos de destino.

Posible mitigación

Te recomendamos que verifiques que tienes la extensión pgtt de PostgreSQL instalada y creada en la base de datos de destino.

Revisar las sugerencias de Gemini

Posible causa:

Este grupo de problemas recoge todos los errores y advertencias genéricos relacionados con la conversión de código mejorada con Gemini.

Posible mitigación: los problemas que se detecten aquí no siempre indican que haya problemas reales, pero le recomendamos que revise todas las conversiones mejoradas con Gemini para asegurarse de que se ajustan a sus expectativas.

Revisar el código aumentado con IA

Posible causa principal: este código DDL se ha convertido con funciones mejoradas de Gemini y puede que tengas que revisarlo para comprobar que es correcto.

Posible solución: Te recomendamos que revises detenidamente el código convertido con aumentos de IA para asegurarte de que el resultado final coincida con la funcionalidad de tu esquema de origen.

Citas

Posible causa principal: las sugerencias mejoradas con Gemini pueden incluir contenido citado de varias fuentes. Algunas citas pueden estar sujetas a restricciones de licencia. Te recomendamos que revises el código convertido para comprobar las citas.

Problemas de conversión de metadatos

Posible causa:

Este grupo incluye todos los problemas de conversión que no se engloban en otros grupos de problemas más específicos.

Posible mitigación

Te recomendamos que revises el código convertido en función de tu conocimiento del modelo de datos de origen y que lo ajustes según sea necesario.

Problemas de conversión de metadatos

Posible causa:

Este grupo incluye todos los problemas de seguimiento de metadatos que no se incluyen en ningún otro grupo de problemas más específico.

Posible mitigación:

Los problemas de este grupo suelen estar relacionados con errores o advertencias de compilación que pueden provocar problemas con los tipos de datos en el PostgreSQL convertido. Te recomendamos que revises el código convertido en función de tus conocimientos sobre el modelo de datos de origen y que ajustes las referencias incorrectas.

Contactar con el equipo de Asistencia

Posible causa principal

En casos extremos especiales, puede que se produzca un error interno con un objeto de origen de Oracle válido. Si lo haces, ponte en contacto con tu equipo de Asistencia para obtener más ayuda.

Problemas generales de conversión

Posible causa principal

Este grupo contiene todos los problemas que no se incluyen en ninguna otra categoría o grupo de problemas más específicos.

Posible mitigación

Te recomendamos que revises el código convertido en función de tu conocimiento del modelo de datos y del código fuente, y que lo ajustes según sea necesario.