Migre aplicaciones heredadas de Oracle Pro*C a ECPG - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Migre aplicaciones heredadas de Oracle Pro*C a ECPG

Creado por Sai Parthasaradhi () y Mahesh Balumuri () AWS AWS

Entorno: PoC o piloto

Origen: Oracle

Objetivo: Postgre SQL

Tipo R: renovar arquitectura

Carga de trabajo: Oracle

Tecnologías: Migración; bases de datos

Resumen

La mayoría de las aplicaciones antiguas que tienen SQL código incorporado utilizan el precompilador Pro*C de Oracle para acceder a la base de datos. Al migrar estas bases de datos de Oracle a Amazon Relational Database Service (RDSAmazon) for SQL Postgre o Amazon Aurora SQL Postgre -Compatible Edition, debe convertir el código de la aplicación a un formato que sea compatible con el precompilador de Postgre, que se denomina. SQL ECPG Este patrón describe cómo convertir el código Pro*C de Oracle a su equivalente en Postgre. SQL ECPG 

Para obtener más información sobre Pro*C, consulte la documentación de Oracle. Para obtener una breve introducciónECPG, consulte la sección de información adicional.

Requisitos previos y limitaciones

Requisitos previos 

  • Una AWS cuenta activa

  • Una base de datos compatible con Amazon RDS for Postgre o SQL Aurora SQL Postgre

  • Una base de datos de Oracle que se ejecuta en las instalaciones

Herramientas

  • Los paquetes de Postgre SQL se enumeran en la siguiente sección.

  • AWSCLI— La interfaz de línea de AWS comandos (AWSCLI) es una herramienta de código abierto para interactuar con los AWS servicios mediante comandos en el shell de la línea de comandos. Con una configuración mínima, puede ejecutar AWS CLI comandos que implementen una funcionalidad equivalente a la proporcionada por la consola de AWS administración basada en un navegador desde una línea de comandos.

Epics

TareaDescripciónHabilidades requeridas
Instale los paquetes de PostgreSQL.

Instale los SQL paquetes de Postgre necesarios mediante los siguientes comandos.

yum update -y yum install -y yum-utils rpm -ivh https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm dnf -qy module disable postgresql
Desarrollador de aplicaciones, ingeniero DevOps
Instale los archivos de encabezado y las bibliotecas.

Instale el paquete postgresql12-devel, que contiene bibliotecas y archivos de encabezado, mediante los siguientes comandos. Instale el paquete tanto en el entorno de desarrollo como en el de tiempo de ejecución para evitar errores en el entorno de ejecución.

dnf -y install postgresql12-devel yum install ncompress zip ghostscript jq unzip wget git -y

Solo para el entorno de desarrollo, ejecute también los siguientes comandos.

yum install zlib-devel make -y ln -s /usr/pgsql-12/bin/ecpg /usr/bin/
Desarrollador de aplicaciones, DevOps ingeniero
Configure la variable de ruta del entorno.

Establezca la ruta del entorno para las bibliotecas SQL cliente de Postgre.

export PATH=$PATH:/usr/pgsql-12/bin
Desarrollador de aplicaciones, ingeniero DevOps
Instale software adicional según sea necesario.

Si es necesario, instálelo pgLoadercomo reemplazo de SQL*Loader en Oracle.

wget -O /etc/yum.repos.d/pgloader-ccl.repo https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/el/7.repo yum install pgloader-ccl -y ln -s /opt/pgloader-ccl/bin/pgloader /usr/bin/

Si llama a alguna aplicación Java desde un módulo Pro*C, instale Java.

yum install java -y

Instale ant para compilar el código Java.

yum install ant -y
Desarrollador de aplicaciones, ingeniero DevOps
Instale el AWSCLI.

Instale los comandos AWS CLI to run para interactuar con AWS servicios como AWS Secrets Manager y Amazon Simple Storage Service (Amazon S3) desde sus aplicaciones.

cd /tmp/ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip ./aws/install -i /usr/local/aws-cli -b /usr/local/bin --update
Desarrollador de aplicaciones, DevOps ingeniero
Identifique los programas que se convertirán.

Identifique las aplicaciones a las que quiere convertir de Pro*C. ECPG

Desarrollador de aplicaciones, propietario de la aplicación
TareaDescripciónHabilidades requeridas
Elimine los encabezados no deseados.

Elimine include los encabezados que no son necesarios en PostgreSQL, como, y. oci.h oratypes sqlda

Propietario de la aplicación, desarrollador de la aplicación
Actualice las declaraciones de variables.

Agregue instrucciones EXEC SQL para todas las declaraciones de variables que se utilizan como variables de host.

Elimine de la aplicación las declaraciones EXEC SQL VAR como las siguientes.

EXEC SQL VAR query IS STRING(2048);
Desarrollador de aplicaciones, propietario de la aplicación
Actualice la funcionalidad. ROWNUM

La ROWNUM función no está disponible en PostgreSQL. Sustitúyala por la función de ROW_NUMBER ventana en SQL las consultas.

Código Pro*C:

SELECT SUBSTR(RTRIM(FILE_NAME,'.txt'),12) INTO :gcpclFileseq   FROM   (SELECT FILE_NAME FROM  DEMO_FILES_TABLE WHERE FILE_NAME    LIKE '%POC%' ORDER BY FILE_NAME DESC) FL2 WHERE ROWNUM <=1 ORDER BY ROWNUM;

ECPGcódigo:

SELECT SUBSTR(RTRIM(FILE_NAME,'.txt'),12) INTO :gcpclFileseq   FROM   (SELECT FILE_NAME , ROW_NUMBER() OVER (ORDER BY FILE_NAME DESC) AS ROWNUM FROM  demo_schema.DEMO_FILES_TABLE WHERE FILE_NAME    LIKE '%POC%' ORDER BY FILE_NAME DESC) FL2 WHERE ROWNUM <=1 ORDER BY ROWNUM;
Desarrollador de aplicaciones, propietario de la aplicación
Actualice los parámetros de la función para usar variables de alias.

En PostgreSQL, los parámetros de la función no se pueden usar como variables de host. Sobrescríbalos mediante una variable de alias.

Código Pro*C:

int processData(int referenceId){   EXEC SQL char col_val[100];   EXEC SQL select column_name INTO :col_val from table_name where col=:referenceId; }

ECPGcódigo:

int processData(int referenceIdParam){   EXEC SQL int referenceId = referenceIdParam;   EXEC SQL char col_val[100];   EXEC SQL select column_name INTO :col_val from table_name where col=:referenceId; }
Desarrollador de aplicaciones, propietario de la aplicación
Actualice los tipos de estructura.

Defina los tipos de struct en los boques EXEC SQL BEGIN y END con typedef si las variables de tipo struct se utilizan como variables de host. Si los tipos de struct están definidos en los archivos de encabezado (.h), incluya los archivos con instrucciones EXEC SQL include.

Código Pro*C:

Archivo de encabezado (demo.h)

struct s_partition_ranges {  char   sc_table_group[31];  char   sc_table_name[31];  char   sc_range_value[10]; }; struct s_partition_ranges_ind {   short    ss_table_group;   short    ss_table_name;   short    ss_range_value; };

ECPGcódigo:

Archivo de encabezado (demo.h)

EXEC SQL BEGIN DECLARE SECTION; typedef struct {   char   sc_table_group[31];   char   sc_table_name[31];   char   sc_range_value[10]; } s_partition_ranges; typedef struct {   short    ss_table_group;   short    ss_table_name;   short    ss_range_value; } s_partition_ranges_ind; EXEC SQL END DECLARE SECTION;

Archivo Pro*C (demo.pc)

#include "demo.h" struct s_partition_ranges gc_partition_data[MAX_PART_TABLE] ; struct s_partition_ranges_ind gc_partition_data_ind[MAX_PART_TABLE] ;

ECPGarchivo (demo.pc)

exec sql include "demo.h" EXEC SQL BEGIN DECLARE SECTION; s_partition_ranges gc_partition_data[MAX_PART_TABLE] ; s_partition_ranges_ind gc_partition_data_ind[MAX_PART_TABLE] ; EXEC SQL END DECLARE SECTION;
Desarrollador de aplicaciones, propietario de la aplicación
Modifique la lógica para extraerla de los cursores.

Para obtener varias filas de los cursores mediante variables de matriz, cambie el código que se va a utilizar FETCH FORWARD.

Código Pro*C:

EXEC SQL char  aPoeFiles[MAX_FILES][FILENAME_LENGTH]; EXEC SQL FETCH filename_cursor into :aPoeFiles;

ECPGcódigo:

EXEC SQL char  aPoeFiles[MAX_FILES][FILENAME_LENGTH]; EXEC SQL int fetchSize = MAX_FILES; EXEC SQL FETCH FORWARD :fetchSize filename_cursor into :aPoeFiles;
Desarrollador de aplicaciones, propietario de la aplicación
Modifique las llamadas a paquetes que no tienen valores de retorno.

Las funciones de los paquetes de Oracle que no tienen valores de retorno se deben llamar con una variable indicadora. Si la aplicación incluye varias funciones que tienen el mismo nombre o si las funciones de tipo desconocido generan errores de tiempo de ejecución, clasifique los valores en los tipos de datos.

Código Pro*C:

void ProcessData (char *data , int id) {                EXEC SQL EXECUTE                BEGIN                   pkg_demo.process_data (:data, :id);                                                                                                  END;        END-EXEC; }

ECPGcódigo:

void ProcessData (char *dataParam, int idParam ) {         EXEC SQL char *data = dataParam;         EXEC SQL int id = idParam;         EXEC SQL short rowInd;         EXEC SQL short rowInd = 0;         EXEC SQL SELECT pkg_demo.process_data (                        inp_data => :data::text,                        inp_id => :id                ) INTO :rowInd; }
Desarrollador de aplicaciones, propietario de la aplicación
Reescribe SQL _ CURSOR variables.

Reescriba la variable SQL_CURSOR y su implementación.

Código Pro*C:

/* SQL Cursor */ SQL_CURSOR      demo_cursor; EXEC SQL ALLOCATE :demo_cursor; EXEC SQL EXECUTE   BEGIN       pkg_demo.get_cursor(             demo_cur=>:demo_cursor       );   END; END-EXEC;

ECPGcódigo:

EXEC SQL DECLARE demo_cursor CURSOR FOR SELECT          * from     pkg_demo.open_filename_rc(             demo_cur=>refcursor           ) ; EXEC SQL char open_filename_rcInd[100]; # As the below function returns cursor_name as # return we need to use char[] type as indicator. EXEC SQL SELECT pkg_demo.get_cursor (         demo_cur=>'demo_cursor'     ) INTO :open_filename_rcInd;
Desarrollador de aplicaciones, propietario de la aplicación
Aplique patrones de migración comunes.
  • Cambia SQL las consultas para que sean compatibles con PostgreSQL.

  • Mueva los bloques anónimos, cuando no estén admitidosECPG, a la base de datos.

  • Elimine dbms_application_info la lógica, que SQL Postgre no admite.

  • Mueva las instrucciones EXEC SQL COMMIT después de cerrar el cursor. Si realiza consultas mientras está en el bucle para recuperar los registros del cursor, el cursor se cierra y se muestra un error que indica que el cursor no existe.

  • Para obtener información sobre cómo gestionar las excepciones ECPG y los códigos de error, consulte Gestión de errores en la documentación de SQL Postgre.

Desarrollador de aplicaciones, propietario de la aplicación
Habilite la depuración, si fuera necesario.

Para ejecutar el ECPG programa en modo de depuración, añada el siguiente comando dentro del bloque de funciones principal.

ECPGdebug(1, stderr);
Desarrollador de aplicaciones, propietario de la aplicación
TareaDescripciónHabilidades requeridas
Cree un archivo ejecutable paraECPG.

Si tiene un archivo fuente en SQL C incrustado denominadoprog1.pgc, puede crear un programa ejecutable mediante la siguiente secuencia de comandos.

ecpg prog1.pgc cc -I/usr/local/pgsql/include -c prog1.c cc -o prog1 prog1.o -L/usr/local/pgsql/lib -lecpg
Desarrollador de aplicaciones, propietario de la aplicación
Cree un archivo de creación para su compilación.

Cree un archivo make para compilar el ECPG programa, como se muestra en el siguiente archivo de ejemplo.

CFLAGS ::= $(CFLAGS) -I/usr/pgsql-12/include -g -Wall LDFLAGS ::= $(LDFLAGS) -L/usr/pgsql-12/lib -Wl,-rpath,/usr/pgsql-12/lib LDLIBS ::= $(LDLIBS) -lecpg PROGRAMS = test  .PHONY: all clean %.c: %.pgc   ecpg $< all: $(PROGRAMS) clean:     rm -f $(PROGRAMS) $(PROGRAMS:%=%.c) $(PROGRAMS:%=%.o)
Desarrollador de aplicaciones, propietario de la aplicación
TareaDescripciónHabilidades requeridas
Pruebe el código.

Pruebe el código de la aplicación que se convertirá para asegurarse de que funciona correctamente.

Desarrollador de aplicaciones, propietario de la aplicación, ingeniero de pruebas

Recursos relacionados

Información adicional

Postgre SQL tiene un precompilador integrado, que es equivalente al SQL precompilador ECPG Pro*C de Oracle. ECPGconvierte los programas en C que tienen SQL sentencias incrustadas en código C estándar sustituyendo las llamadas por llamadas a funciones especiales. SQL Luego, los archivos de salida se pueden procesar con cualquier cadena de herramientas del compilador de C.

Archivos de entrada y salida

ECPGconvierte cada archivo de entrada que especifique en la línea de comandos en el archivo de salida C correspondiente. Si el nombre de un archivo de entrada no tiene una extensión de archivo, se asume la extensión .pgc. La extensión del archivo se sustituye por .c para construir el nombre del archivo de salida. Sin embargo, puede anular el nombre del archivo de salida predeterminado utilizando la opción -o.

Si utiliza un guión (-) como nombre del archivo de entrada, ECPG lee el programa desde la entrada estándar y escribe en la salida estándar, a menos que lo anule mediante la -o opción.

Archivos de encabezado

Cuando el SQL compilador de Postgre compila los archivos de código C preprocesados, busca los archivos de ECPG cabecera en el directorio de Postgre. SQL include Por lo tanto, puede que tenga que usar la opción -I para dirigir el compilador al directorio correcto (por ejemplo, -I/usr/local/pgsql/include).

Bibliotecas

Los programas que utilizan código C con código incrustado SQL tienen que estar enlazados a la biblioteca. libecpg Por ejemplo, puede utilizar las opciones  -L/usr/local/pgsql/lib -lecpg del enlazador.

ECPGLas aplicaciones convertidas llaman a las funciones de la libpq biblioteca a través de la SQL biblioteca integrada (ecpglib) y se comunican con el SQL servidor Postgre mediante el protocolo estándar de frontend/backend.