

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Migrazione delle applicazioni legacy da Oracle Pro\$1C a ECPG
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg"></a>

*Sai Parthasaradhi e Mahesh Balumuri, Amazon Web Services*

## Riepilogo
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-summary"></a>

La maggior parte delle applicazioni legacy con codice SQL incorporato utilizza il precompilatore Oracle Pro\$1C per accedere al database. Quando esegui la migrazione di questi database Oracle ad Amazon Relational Database Service (Amazon RDS) per PostgreSQL o Amazon Aurora PostgreSQL Compatible Edition, devi convertire il codice dell'applicazione in un formato compatibile con il precompilatore di PostgreSQL, chiamato ECPG. Questo modello descrive come convertire il codice Oracle Pro\$1C nel suo equivalente in PostgreSQL ECPG. 

[Per ulteriori informazioni su Pro\$1C, consulta la documentazione Oracle.](https://docs.oracle.com/cd/E11882_01/appdev.112/e10825/pc_01int.htm#i2415) Per una breve introduzione a ECPG, vedere la sezione Informazioni [aggiuntive](#migrate-legacy-applications-from-oracle-pro-c-to-ecpg-additional).

## Prerequisiti e limitazioni
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-prereqs"></a>

**Prerequisiti**
+ Un account AWS attivo
+ Un database compatibile con Amazon RDS per PostgreSQL o Aurora PostgreSQL
+ Un database Oracle in esecuzione in locale

## Tools (Strumenti)
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-tools"></a>
+ I pacchetti PostgreSQL elencati nella sezione successiva.
+ [AWS CLI — L'](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)AWS Command Line Interface (AWS CLI) è uno strumento open source per interagire con i servizi AWS tramite comandi nella shell della riga di comando. Con una configurazione minima, puoi eseguire comandi AWS CLI che implementano funzionalità equivalenti a quelle fornite dalla Console di gestione AWS basata su browser da un prompt dei comandi.

## Epiche
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-epics"></a>

### Imposta l'ambiente di compilazione su CentOS o RHEL
<a name="set-the-build-environment-on-centos-or-rhel"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Installa i pacchetti PostgreSQL. | Installa i pacchetti PostgreSQL richiesti utilizzando i seguenti comandi.<pre>yum update -y<br />yum install -y yum-utils<br />rpm -ivh https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm<br />dnf -qy module disable postgresql</pre> | Sviluppatore di app, ingegnere DevOps  | 
| Installa i file di intestazione e le librerie. | Installa il `postgresql12-devel` pacchetto, che contiene i file di intestazione e le librerie, utilizzando i seguenti comandi. Installa il pacchetto sia nell'ambiente di sviluppo che in quello di runtime per evitare errori nell'ambiente di runtime.<pre>dnf -y install postgresql12-devel<br />yum install ncompress zip ghostscript jq unzip wget git -y</pre>Solo per l'ambiente di sviluppo, esegui anche i seguenti comandi.<pre>yum install zlib-devel make -y<br />ln -s /usr/pgsql-12/bin/ecpg /usr/bin/</pre> | Sviluppatore di app, DevOps ingegnere | 
| Configura la variabile del percorso di ambiente. | Imposta il percorso dell'ambiente per le librerie client PostgreSQL.<pre>export PATH=$PATH:/usr/pgsql-12/bin</pre> | Sviluppatore di app, ingegnere DevOps  | 
| Installa software aggiuntivo se necessario. | Se necessario, installare **pgLoader** in sostituzione di **SQL\$1Loader in Oracle**.<pre>wget -O /etc/yum.repos.d/pgloader-ccl.repo https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/el/7.repo<br />yum install pgloader-ccl -y<br />ln -s /opt/pgloader-ccl/bin/pgloader /usr/bin/</pre>Se state chiamando delle applicazioni Java dai moduli Pro\$1C, installate Java.<pre>yum install java -y</pre>Installa **ant** per compilare il codice Java.<pre>yum install ant -y</pre> | Sviluppatore di app, DevOps ingegnere | 
| Installare l'interfaccia a riga di comando di AWS. | Installa l'AWS CLI per eseguire comandi per interagire con servizi AWS come AWS Secrets Manager e Amazon Simple Storage Service (Amazon S3) Simple Storage Service (Amazon S3) dalle tue applicazioni.<pre>cd /tmp/<br />curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"<br />unzip awscliv2.zip<br />./aws/install -i /usr/local/aws-cli -b /usr/local/bin --update</pre> | Sviluppatore di app, ingegnere DevOps  | 
| Identifica i programmi da convertire. | Identifica le applicazioni che desideri convertire da Pro\$1C a ECPG. | Sviluppatore di app, proprietario dell'app | 

### Converti il codice Pro\$1C in ECPG
<a name="convert-pro-c-code-to-ecpg"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Rimuovi le intestazioni indesiderate. | Rimuovi le `include ` intestazioni che non sono richieste in PostgreSQL, ad esempio, e. `oci.h` `oratypes` `sqlda` | Proprietario dell'app, sviluppatore dell'app | 
| Aggiorna le dichiarazioni delle variabili. | Aggiungi `EXEC SQL` istruzioni per tutte le dichiarazioni di variabili utilizzate come variabili host.Rimuovi `EXEC SQL VAR` le dichiarazioni come le seguenti dall'applicazione.<pre>EXEC SQL VAR query IS STRING(2048);</pre> | Sviluppatore di app, proprietario dell'app | 
| Aggiorna la funzionalità ROWNUM. | La `ROWNUM` funzione non è disponibile in PostgreSQL. Sostituiscila con la funzione `ROW_NUMBER` window nelle query SQL.Codice Pro\$1C:<pre>SELECT SUBSTR(RTRIM(FILE_NAME,'.txt'),12) INTO :gcpclFileseq  <br />FROM   (SELECT FILE_NAME <br />FROM  DEMO_FILES_TABLE <br />WHERE FILE_NAME    LIKE '%POC%' <br />ORDER BY FILE_NAME DESC) FL2 <br />WHERE ROWNUM <=1 ORDER BY ROWNUM;</pre>Codice ECPG:<pre>SELECT SUBSTR(RTRIM(FILE_NAME,'.txt'),12) INTO :gcpclFileseq  <br />FROM   (SELECT FILE_NAME , ROW_NUMBER() OVER (ORDER BY FILE_NAME DESC) AS ROWNUM<br />FROM  demo_schema.DEMO_FILES_TABLE <br />WHERE FILE_NAME    LIKE '%POC%'<br />ORDER BY FILE_NAME DESC) FL2 <br />WHERE ROWNUM <=1 ORDER BY ROWNUM; </pre> | Sviluppatore di app, proprietario dell'app | 
| Aggiorna i parametri della funzione per utilizzare le variabili alias. | In PostgreSQL, i parametri delle funzioni non possono essere usati come variabili host. Sovrascrivili utilizzando una variabile alias.Codice Pro\$1C:<pre>int processData(int referenceId){<br />  EXEC SQL char col_val[100];<br />  EXEC SQL select column_name INTO :col_val from table_name where col=:referenceId;<br />}</pre>Codice ECPG:<pre>int processData(int referenceIdParam){<br />  EXEC SQL int referenceId = referenceIdParam;<br />  EXEC SQL char col_val[100];<br />  EXEC SQL select column_name INTO :col_val from table_name where col=:referenceId;<br />}</pre> | Sviluppatore di app, proprietario dell'app | 
| Aggiorna i tipi di struttura. | Definisci `struct` i tipi `EXEC SQL BEGIN` e `END` i blocchi specificando `typedef` se le variabili `struct` di tipo vengono utilizzate come variabili host. Se i `struct` tipi sono definiti nei file header (`.h`), includi i file con le istruzioni `EXEC SQL` include.Codice Pro\$1C:File di intestazione () `demo.h`<pre>struct s_partition_ranges<br />{<br /> char   sc_table_group[31];<br /> char   sc_table_name[31];<br /> char   sc_range_value[10];<br />}; <br />struct s_partition_ranges_ind<br />{<br />  short    ss_table_group;<br />  short    ss_table_name;<br />  short    ss_range_value;<br />}; </pre>Codice ECPG:File di intestazione () `demo.h`<pre>EXEC SQL BEGIN DECLARE SECTION;<br />typedef struct <br />{<br />  char   sc_table_group[31];<br />  char   sc_table_name[31];<br />  char   sc_range_value[10];<br />} s_partition_ranges; <br />typedef struct <br />{<br />  short    ss_table_group;<br />  short    ss_table_name;<br />  short    ss_range_value;<br />} s_partition_ranges_ind; <br />EXEC SQL END DECLARE SECTION;</pre>File Pro\$1C () `demo.pc`<pre>#include "demo.h"<br />struct s_partition_ranges gc_partition_data[MAX_PART_TABLE] ;<br />struct s_partition_ranges_ind gc_partition_data_ind[MAX_PART_TABLE] ;</pre>File ECPG () `demo.pc`<pre>exec sql include "demo.h"<br />EXEC SQL BEGIN DECLARE SECTION;<br />s_partition_ranges gc_partition_data[MAX_PART_TABLE] ;<br />s_partition_ranges_ind gc_partition_data_ind[MAX_PART_TABLE] ;<br />EXEC SQL END DECLARE SECTION;</pre> | Sviluppatore di app, proprietario dell'app | 
| Modifica la logica da recuperare dai cursori. | Per recuperare più righe dai cursori utilizzando variabili di matrice, modificate il codice da utilizzare. `FETCH FORWARD`Codice Pro\$1C:<pre>EXEC SQL char  aPoeFiles[MAX_FILES][FILENAME_LENGTH];<br />EXEC SQL FETCH filename_cursor into :aPoeFiles;</pre>Codice ECPG:<pre>EXEC SQL char  aPoeFiles[MAX_FILES][FILENAME_LENGTH];<br />EXEC SQL int fetchSize = MAX_FILES;<br />EXEC SQL FETCH FORWARD :fetchSize filename_cursor into :aPoeFiles;</pre> | Sviluppatore di app, proprietario dell'app | 
| Modifica le chiamate ai pacchetti che non hanno valori restituiti. | Le funzioni dei pacchetti Oracle che non hanno valori restituiti devono essere chiamate con una variabile indicatore. Se l'applicazione include più funzioni con lo stesso nome o se le funzioni di tipo sconosciuto generano errori di runtime, digita i valori nei tipi di dati.Codice Pro\$1C:<pre>void ProcessData (char *data , int id)<br />{        <br />        EXEC SQL EXECUTE<br />               BEGIN<br />                  pkg_demo.process_data (:data, :id);                                                                                    <br />               END;<br />       END-EXEC;<br />}</pre>Codice ECPG:<pre>void ProcessData (char *dataParam, int idParam )<br />{<br />        EXEC SQL char *data = dataParam;<br />        EXEC SQL int id = idParam;<br />        EXEC SQL short rowInd;<br />        EXEC SQL short rowInd = 0;<br />        EXEC SQL SELECT pkg_demo.process_data (<br />                       inp_data => :data::text,<br />                       inp_id => :id<br />               ) INTO :rowInd;<br />}</pre> | Sviluppatore di app, proprietario dell'app | 
| Riscrivi le variabili SQL\$1CURSOR. | Riscrivi la variabile e la sua implementazione. `SQL_CURSOR`Codice Pro\$1C:<pre>/* SQL Cursor */<br />SQL_CURSOR      demo_cursor;<br />EXEC SQL ALLOCATE :demo_cursor;<br />EXEC SQL EXECUTE<br />  BEGIN<br />      pkg_demo.get_cursor(     <br />        demo_cur=>:demo_cursor<br />      );<br />  END;<br />END-EXEC;</pre>Codice ECPG:<pre>EXEC SQL DECLARE demo_cursor CURSOR FOR SELECT<br />         * from<br />    pkg_demo.open_filename_rc(<br />            demo_cur=>refcursor<br />          ) ;<br />EXEC SQL char open_filename_rcInd[100]; <br /># As the below function returns cursor_name as <br /># return we need to use char[] type as indicator. <br />EXEC SQL SELECT pkg_demo.get_cursor (<br />        demo_cur=>'demo_cursor'<br />    ) INTO :open_filename_rcInd;</pre> | Sviluppatore di app, proprietario dell'app | 
| Applica modelli di migrazione comuni. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/migrate-legacy-applications-from-oracle-pro-c-to-ecpg.html) | Sviluppatore di app, proprietario dell'app | 
| Abilita il debug, se necessario.  | Per eseguire il programma ECPG in modalità debug, aggiungete il seguente comando all'interno del blocco funzionale principale.<pre>ECPGdebug(1, stderr); </pre> | Sviluppatore dell'app, proprietario dell'app | 

### Compila programmi ECPG
<a name="compile-ecpg-programs"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea un file eseguibile per ECPG. | Se disponete di un file sorgente SQL C incorporato denominato`prog1.pgc`, potete creare un programma eseguibile utilizzando la seguente sequenza di comandi.<pre>ecpg prog1.pgc<br />cc -I/usr/local/pgsql/include -c prog1.c<br />cc -o prog1 prog1.o -L/usr/local/pgsql/lib -lecpg</pre> | Sviluppatore di app, proprietario dell'app | 
| Crea un make file per la compilazione. | Create un make file per compilare il programma ECPG, come mostrato nel seguente file di esempio.<pre>CFLAGS ::= $(CFLAGS) -I/usr/pgsql-12/include -g -Wall<br />LDFLAGS ::= $(LDFLAGS) -L/usr/pgsql-12/lib -Wl,-rpath,/usr/pgsql-12/lib<br />LDLIBS ::= $(LDLIBS) -lecpg<br />PROGRAMS = test <br />.PHONY: all clean<br />%.c: %.pgc<br />      ecpg $<<br />all: $(PROGRAMS)<br />clean:<br />    rm -f $(PROGRAMS) $(PROGRAMS:%=%.c) $(PROGRAMS:%=%.o)</pre> | Sviluppatore di app, proprietario dell'app | 

### Eseguire il test dell’applicazione
<a name="test-the-application"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Test del codice. | Verifica il codice dell'applicazione convertito per assicurarti che funzioni correttamente. | Sviluppatore di app, proprietario dell'app, tecnico di test | 

## Risorse correlate
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-resources"></a>
+ [ECPG - SQL integrato in C](https://www.postgresql.org/docs/current/static/ecpg.html) (documentazione PostgreSQL)
+ [Gestione degli errori](https://www.postgresql.org/docs/12/ecpg-errors.html) (documentazione PostgreSQL)
+ [Perché utilizzare il precompilatore Oracle Pro\$1C/C\$1\$1](https://docs.oracle.com/cd/E11882_01/appdev.112/e10825/pc_01int.htm#i2415) (documentazione Oracle)

## Informazioni aggiuntive
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-additional"></a>

PostgreSQL ha un precompilatore SQL incorporato, ECPG, che è equivalente al precompilatore Oracle Pro\$1C. ECPG converte i programmi C che hanno istruzioni SQL incorporate in codice C standard sostituendo le chiamate SQL con chiamate a funzioni speciali. I file di output possono quindi essere elaborati con qualsiasi catena di strumenti del compilatore C.

**File di input e output**

ECPG converte ogni file di input specificato nella riga di comando nel file di output C corrispondente. Se il nome di un file di input non ha un'estensione di file, viene utilizzato l'estensione.pgc. L'estensione del file viene sostituita da `.c` per costruire il nome del file di output. Tuttavia, è possibile sovrascrivere il nome del file di output predefinito utilizzando l'`-o`opzione.

Se utilizzate un trattino (`-`) come nome del file di input, ECPG legge il programma dallo standard input e scrive sullo standard output, a meno che non lo sovrascriviate utilizzando l'opzione. `-o`

**File di intestazione**

Quando il compilatore PostgreSQL compila i file di codice C preelaborati, cerca i file di intestazione ECPG nella directory PostgreSQL. `include` Pertanto, potrebbe essere necessario utilizzare l'`-I`opzione per indirizzare il compilatore alla directory corretta (ad esempio,). `-I/usr/local/pgsql/include`

**Libraries** (Librerie)

I programmi che utilizzano codice C con SQL incorporato devono essere collegati alla `libecpg` libreria. Ad esempio, è possibile utilizzare le opzioni ` -L/usr/local/pgsql/lib -lecpg` del linker.

Le applicazioni ECPG convertite richiamano le funzioni della `libpq` libreria tramite la libreria SQL incorporata (`ecpglib`) e comunicano con il server PostgreSQL utilizzando il protocollo standard. frontend/backend 