

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Migrieren Sie Legacy-Anwendungen von Oracle Pro\*C zu ECPG
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg"></a>

*Sai Parthasaradhi und Mahesh Balumuri, Amazon Web Services*

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

Die meisten älteren Anwendungen mit eingebettetem SQL-Code verwenden den Oracle Pro\*C-Precompiler für den Zugriff auf die Datenbank. Wenn Sie diese Oracle-Datenbanken zu Amazon Relational Database Service (Amazon RDS) for PostgreSQL oder Amazon Aurora PostgreSQL-Compatible Edition migrieren, müssen Sie Ihren Anwendungscode in ein Format konvertieren, das mit dem Precompiler in PostgreSQL kompatibel ist, das als ECPG bezeichnet wird. Dieses Muster beschreibt, wie Oracle Pro\*C-Code in sein Äquivalent in PostgreSQL ECPG konvertiert wird. 

[Weitere Informationen zu Pro\*C finden Sie in der Oracle-Dokumentation.](https://docs.oracle.com/cd/E11882_01/appdev.112/e10825/pc_01int.htm#i2415) Eine kurze Einführung in ECPG finden Sie im Abschnitt [Zusätzliche](#migrate-legacy-applications-from-oracle-pro-c-to-ecpg-additional) Informationen.

## Voraussetzungen und Einschränkungen
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-prereqs"></a>

**Voraussetzungen**
+ Ein aktives AWS-Konto
+ Eine Amazon RDS for PostgreSQL- oder Aurora PostgreSQL-kompatible Datenbank
+ Eine Oracle-Datenbank, die lokal läuft

## Tools
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-tools"></a>
+ Die im nächsten Abschnitt aufgeführten PostgreSQL-Pakete.
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) — Die AWS-Befehlszeilenschnittstelle (AWS CLI) ist ein Open-Source-Tool für die Interaktion mit AWS-Services über Befehle in Ihrer Befehlszeilen-Shell. Mit minimaler Konfiguration können Sie AWS-CLI-Befehle, die Funktionen implementieren, die der von der browserbasierten AWS-Managementkonsole bereitgestellten Funktionen entsprechen, von einer Befehlszeile aus ausführen.

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

### Stellen Sie die Build-Umgebung auf CentOS oder RHEL ein
<a name="set-the-build-environment-on-centos-or-rhel"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Installieren Sie PostgreSQL-Pakete. | Installieren Sie die erforderlichen PostgreSQL-Pakete mithilfe der folgenden Befehle.<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> | App-Entwickler, Ingenieur DevOps  | 
| Installieren Sie die Header-Dateien und Bibliotheken. | Installieren Sie das `postgresql12-devel` Paket, das Header-Dateien und Bibliotheken enthält, mithilfe der folgenden Befehle. Installieren Sie das Paket sowohl in der Entwicklungs- als auch in der Laufzeitumgebung, um Fehler in der Laufzeitumgebung zu vermeiden.<pre>dnf -y install postgresql12-devel<br />yum install ncompress zip ghostscript jq unzip wget git -y</pre><br />Führen Sie nur für die Entwicklungsumgebung auch die folgenden Befehle aus.<pre>yum install zlib-devel make -y<br />ln -s /usr/pgsql-12/bin/ecpg /usr/bin/</pre> | App-Entwickler, DevOps Ingenieur | 
| Konfigurieren Sie die Umgebungspfadvariable. | Legen Sie den Umgebungspfad für PostgreSQL-Clientbibliotheken fest.<pre>export PATH=$PATH:/usr/pgsql-12/bin</pre> | App-Entwickler, Ingenieur DevOps  | 
| Installieren Sie bei Bedarf zusätzliche Software. | Falls erforderlich, installieren Sie **PGLoader als** Ersatz für **SQL\*Loader** 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><br />Wenn Sie Java-Anwendungen von Pro\*C-Modulen aus aufrufen, installieren Sie Java.<pre>yum install java -y</pre><br />Installieren Sie **Ant**, um den Java-Code zu kompilieren.<pre>yum install ant -y</pre> | App-Entwickler, DevOps Ingenieur | 
| Installieren Sie den AWS CLI. | Installieren Sie die AWS-CLI, um Befehle zur Interaktion mit AWS-Services wie AWS Secrets Manager und Amazon Simple Storage Service (Amazon S3) von Ihren Anwendungen aus auszuführen.<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> | App-Entwickler, DevOps Ingenieur | 
| Identifizieren Sie die Programme, die konvertiert werden sollen. | Identifizieren Sie die Anwendungen, die Sie von Pro\*C nach ECPG konvertieren möchten. | App-Entwickler, App-Besitzer | 

### Pro\*C-Code nach ECPG konvertieren
<a name="convert-pro-c-code-to-ecpg"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Unerwünschte Header entfernen. | Entfernen Sie die `include ` Header, die in PostgreSQL nicht erforderlich sind, wie`oci.h`, und`oratypes`. `sqlda` | App-Besitzer, App-Entwickler | 
| Variablendeklarationen aktualisieren. | Fügen Sie `EXEC SQL` Anweisungen für alle Variablendeklarationen hinzu, die als Hostvariablen verwendet werden.<br />Entfernen Sie die `EXEC SQL VAR` Deklarationen wie die folgenden aus Ihrer Anwendung.<pre>EXEC SQL VAR query IS STRING(2048);</pre> | App-Entwickler, App-Besitzer | 
| Aktualisieren Sie die ROWNUM-Funktionalität. | Die `ROWNUM` Funktion ist in PostgreSQL nicht verfügbar. Ersetzen Sie dies in SQL-Abfragen durch die `ROW_NUMBER` Fensterfunktion.<br />Pro\*C-Code:<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><br />ECPG-Kode:<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> | App-Entwickler, App-Besitzer | 
| Aktualisieren Sie die Funktionsparameter, um Aliasvariablen zu verwenden. | In PostgreSQL können Funktionsparameter nicht als Hostvariablen verwendet werden. Überschreiben Sie sie mithilfe einer Aliasvariablen.<br />Pro\*C-Code:<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><br />ECPG-Kode:<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> | App-Entwickler, App-Besitzer | 
| Aktualisieren Sie die Strukturtypen. | Definieren Sie `struct` Typen in `EXEC SQL BEGIN` und `END` Blöcke mit`typedef`, wenn die `struct` Typvariablen als Hostvariablen verwendet werden. Wenn die `struct` Typen in Header (`.h`) -Dateien definiert sind, schließen Sie die Dateien mit `EXEC SQL` Include-Anweisungen ein.<br />Pro\*C-Code:<br />Header-Datei () `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><br />ECPG-Code:<br />Header-Datei () `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><br />Pro\*C-Datei () `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><br />ECPG-Datei () `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> | App-Entwickler, App-Besitzer | 
| Ändern Sie die Logik, um von Cursorn abzurufen. | Um mithilfe von Array-Variablen mehrere Zeilen aus Cursorn abzurufen, ändern Sie den zu verwendenden Code. `FETCH FORWARD`<br />Pro\*C-Code:<pre>EXEC SQL char  aPoeFiles[MAX_FILES][FILENAME_LENGTH];<br />EXEC SQL FETCH filename_cursor into :aPoeFiles;</pre><br />ECPG-Kode:<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> | App-Entwickler, App-Besitzer | 
| Ändern Sie Paketaufrufe, die keine Rückgabewerte haben. | Oracle-Paketfunktionen, die keine Rückgabewerte haben, sollten mit einer Indikatorvariablen aufgerufen werden. Wenn Ihre Anwendung mehrere Funktionen mit demselben Namen enthält oder wenn die Funktionen unbekannter Typen Laufzeitfehler erzeugen, typisieren Sie die Werte in die Datentypen.<br />Pro\*C-Code:<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><br />ECPG-Kode:<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> | App-Entwickler, App-Besitzer | 
| Schreiben Sie SQL\_CURSOR-Variablen neu. | Schreiben Sie die `SQL_CURSOR` Variable und ihre Implementierung neu.<br />Pro\*C-Code:<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><br />ECPG-Kode:<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> | App-Entwickler, App-Besitzer | 
| Wenden Sie gängige Migrationsmuster an. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/migrate-legacy-applications-from-oracle-pro-c-to-ecpg.html) | App-Entwickler, App-Besitzer | 
| Aktivieren Sie das Debugging, falls erforderlich.  | Um das ECPG-Programm im Debug-Modus auszuführen, fügen Sie dem Hauptfunktionsblock den folgenden Befehl hinzu.<pre>ECPGdebug(1, stderr); </pre> | App-Entwickler, App-Besitzer | 

### Kompilieren Sie ECPG-Programme
<a name="compile-ecpg-programs"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie eine ausführbare Datei für ECPG. | Wenn Sie eine eingebettete SQL C-Quelldatei mit dem Namen haben`prog1.pgc`, können Sie mithilfe der folgenden Befehlsfolge ein ausführbares Programm erstellen.<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> | App-Entwickler, App-Besitzer | 
| Erstellen Sie eine Make-Datei für die Kompilierung. | Erstellen Sie eine Make-Datei, um das ECPG-Programm zu kompilieren, wie in der folgenden Beispieldatei gezeigt.<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> | App-Entwickler, App-Besitzer | 

### Testen der Anwendung
<a name="test-the-application"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Testen Sie den Code. | Testen Sie den konvertierten Anwendungscode, um sicherzustellen, dass er ordnungsgemäß funktioniert. | App-Entwickler, App-Besitzer, Testingenieur | 

## Zugehörige Ressourcen
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-resources"></a>
+ [ECPG - Eingebettetes SQL in C](https://www.postgresql.org/docs/current/static/ecpg.html) (PostgreSQL-Dokumentation)
+ [Fehlerbehandlung](https://www.postgresql.org/docs/12/ecpg-errors.html) (PostgreSQL-Dokumentation)
+ [Warum den Oracle Pro\*C/C\+\+ Precompiler verwenden](https://docs.oracle.com/cd/E11882_01/appdev.112/e10825/pc_01int.htm#i2415) (Oracle-Dokumentation)

## Zusätzliche Informationen
<a name="migrate-legacy-applications-from-oracle-pro-c-to-ecpg-additional"></a>

PostgreSQL hat einen eingebetteten SQL-Precompiler, ECPG, der dem Oracle Pro\*C-Precompiler entspricht. ECPG konvertiert C-Programme mit eingebetteten SQL-Anweisungen in Standard-C-Code, indem es die SQL-Aufrufe durch spezielle Funktionsaufrufen ersetzt. Die Ausgabedateien können dann mit jeder C-Compiler-Toolchain verarbeitet werden.

**Eingabe- und Ausgabedateien**

ECPG konvertiert jede Eingabedatei, die Sie in der Befehlszeile angeben, in die entsprechende C-Ausgabedatei. Wenn ein Eingabedateiname keine Dateierweiterung hat, wird .pgc angenommen. Die Erweiterung der Datei wird durch ersetzt, `.c` um den Namen der Ausgabedatei zu erstellen. Sie können jedoch den Standardnamen der Ausgabedatei überschreiben, indem Sie die `-o` Option verwenden.

Wenn Sie einen Bindestrich (`-`) als Namen der Eingabedatei verwenden, liest ECPG das Programm aus der Standardeingabe und schreibt in die Standardausgabe, sofern Sie dies nicht mit der `-o` Option überschreiben.

**Header-Dateien**

Wenn der PostgreSQL-Compiler die vorverarbeiteten C-Codedateien kompiliert, sucht er im PostgreSQL-Verzeichnis nach den ECPG-Header-Dateien. `include` Daher müssen Sie möglicherweise die `-I` Option verwenden, um den Compiler auf das richtige Verzeichnis zu verweisen (z. B.). `-I/usr/local/pgsql/include`

**Bibliotheken**

Programme, die C-Code mit Embedded SQL verwenden, müssen mit der `libecpg` Bibliothek verknüpft werden. Sie können beispielsweise die Linker-Optionen ` -L/usr/local/pgsql/lib -lecpg` verwenden.

Konvertierte ECPG-Anwendungen rufen Funktionen in der `libpq` Bibliothek über die Embedded SQL-Bibliothek (`ecpglib`) auf und kommunizieren mithilfe des Standardprotokolls mit dem PostgreSQL-Server. frontend/backend 