

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.

# Emulieren Sie PL/SQL assoziative Oracle-Arrays in Amazon Aurora PostgreSQL und Amazon RDS for PostgreSQL
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql"></a>

*Rajkumar Raghuwanshi, Bhanu Ganesh Gudivada und Sachin Khanna, Amazon Web Services*

## Zusammenfassung
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-summary"></a>

Dieses Muster beschreibt, wie PL/SQL assoziative Oracle-Arrays mit leeren Indexpositionen in [Amazon Aurora PostgreSQL- und [Amazon](https://aws.amazon.com/rds/postgresql/) RDS for PostgreSQL PostgreSQL-Umgebungen](https://aws.amazon.com/rds/aurora/) emuliert werden. Es beschreibt auch einige der Unterschiede zwischen PL/SQL assoziativen Oracle-Arrays und PostgreSQL-Arrays in Bezug darauf, wie jedes einzelne mit leeren Indexpositionen während Migrationen umgeht.

Wir bieten eine PostgreSQL-Alternative zur Verwendung von `aws_oracle_ext` Funktionen zur Behandlung leerer Indexpositionen bei der Migration einer Oracle-Datenbank. Dieses Muster verwendet eine zusätzliche Spalte, um Indexpositionen zu speichern, und es behält den Umgang von Oracle mit spärlichen Arrays bei und integriert gleichzeitig native PostgreSQL-Funktionen.

*Oracle*

In Oracle können Sammlungen als leer initialisiert und mit der `EXTEND` Collection-Methode aufgefüllt werden, bei der Elemente an das Array angehängt werden. `NULL` Bei der Arbeit mit PL/SQL assoziativen Arrays, die mit indexiert sind`PLS_INTEGER`, fügt die `EXTEND` Methode Elemente sequentiell hinzu. `NULL` Elemente können aber auch an nicht sequentiellen Indexpositionen initialisiert werden. Jede Indexposition, die nicht explizit initialisiert wurde, bleibt leer.

Diese Flexibilität ermöglicht spärliche Array-Strukturen, in denen Elemente an beliebigen Positionen aufgefüllt werden können. Bei der Iteration durch Sammlungen mit einem `FOR LOOP` mit `FIRST` und `LAST` Grenzen werden nur die initialisierten Elemente (unabhängig davon, ob `NULL` oder mit einem definierten Wert) verarbeitet, während leere Positionen übersprungen werden.

*PostgreSQL (Amazon Aurora und Amazon RDS)*

PostgreSQL behandelt leere Werte anders `NULL` als Werte. Es speichert leere Werte als unterschiedliche Entitäten, die ein Byte Speicherplatz verwenden. Wenn ein Array leere Werte enthält, weist PostgreSQL sequentielle Indexpositionen genau wie nicht leere Werte zu. Die sequentielle Indizierung erfordert jedoch zusätzliche Verarbeitung, da das System alle indizierten Positionen durchlaufen muss, einschließlich der leeren. Dies macht die herkömmliche Array-Erstellung für spärliche Datensätze ineffizient.

*AWS Schema Conversion Tool*

The [AWS Schema Conversion Tool (AWS SCT) verarbeitet Oracle-to-PostgreSQL Migrationen](https://docs.aws.amazon.com/SchemaConversionTool/) in der Regel mithilfe von Funktionen. `aws_oracle_ext` In diesem Muster schlagen wir einen alternativen Ansatz vor, der native PostgreSQL-Funktionen verwendet und PostgreSQL-Arraytypen mit einer zusätzlichen Spalte zum Speichern von Indexpositionen kombiniert. Das System kann dann durch Arrays iterieren, indem es nur die Indexspalte verwendet.

## Voraussetzungen und Einschränkungen
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-prereqs"></a>

**Voraussetzungen**
+ Ein aktiver AWS-Konto
+ Administratorberechtigungen in AWS Identity and Access Management (IAM)
+ Eine Instance, die mit Amazon RDS oder Aurora PostgreSQL kompatibel ist
+ Kenntnisse als Datenbankarchitekt oder -entwickler mit Oracle und PostgreSQL

**Einschränkungen**
+ Einige AWS-Services sind nicht in allen verfügbar. AWS-Regionen Informationen zur Verfügbarkeit in den einzelnen Regionen finden Sie [AWS-Services unter Nach Regionen](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/). Informationen zu bestimmten Endpunkten finden Sie auf der Seite [Dienstendpunkte und Kontingente](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html). Wählen Sie dort den Link für den Dienst aus.

**Produktversionen**

Dieses Muster wurde mit den folgenden Versionen getestet:
+ Amazon Aurora PostgreSQL 13.3
+ Amazon RDS for PostgreSQL 13.3
+ AWS SCT 1.0.674
+ Oracle 19c EE

## Architektur
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-architecture"></a>

**Quelltechnologie-Stack**
+ On-premises Oracle-Datenbank

**Zieltechnologie-Stack**
+ Amazon Aurora PostgreSQL
+ Amazon RDS für PostgreSQL

**Zielarchitektur**

![](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/a62d038c-ca3c-41e1-aa7e-74282d2e54f4/images/13aacf00-655a-4149-a4e7-42b66dbea4e1.png)


Das Diagramm zeigt Folgendes:
+ Eine Amazon RDS for Oracle-Quelldatenbank-Instance
+ Eine Amazon EC2 EC2-Instance mit AWS SCT zur Konvertierung von Oracle-Funktionen in das PostgreSQL-Äquivalent
+ Eine Zieldatenbank, die mit Amazon Aurora PostgreSQL kompatibel ist

## Tools
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-tools"></a>

**AWS-Services**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) ist eine vollständig verwaltete relationale Datenbank-Engine, die für die Cloud entwickelt wurde und mit MySQL und PostgreSQL kompatibel ist.
+ [Amazon Aurora PostgreSQL-Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) ist eine vollständig verwaltete, ACID-compliant relationale Datenbank-Engine, die Sie bei der Einrichtung, dem Betrieb und der Skalierung von PostgreSQL-Bereitstellungen unterstützt.
+ [Amazon Elastic Compute Cloud (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) bietet sichere und skalierbare Rechenkapazität in der AWS Cloud. Sie können so viele virtuelle Server wie nötig nutzen und sie schnell nach oben oder unten skalieren.
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) unterstützt Sie bei der Einrichtung, dem Betrieb und der Skalierung einer relationalen Datenbank in der. AWS Cloud
+ [Amazon Relational Database Service (Amazon RDS) für Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html) unterstützt Sie bei der Einrichtung, dem Betrieb und der Skalierung einer relationalen Oracle-Datenbank in der. AWS Cloud
+ [Amazon Relational Database Service (Amazon RDS) für PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) unterstützt Sie bei der Einrichtung, dem Betrieb und der Skalierung einer relationalen PostgreSQL-Datenbank in der. AWS Cloud
+ [AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html) unterstützt heterogene Datenbankmigrationen, indem das Quelldatenbankschema und ein Großteil des benutzerdefinierten Codes automatisch in ein Format konvertiert werden, das mit der Zieldatenbank kompatibel ist.

**Andere Tools**
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) ist eine integrierte Entwicklungsumgebung, die die Entwicklung und Verwaltung von Oracle-Datenbanken sowohl in herkömmlichen als auch in Cloud-basierten Bereitstellungen vereinfacht.
+ [pgAdmin](https://www.pgadmin.org/) ist ein Open-Source-Verwaltungstool für PostgreSQL. Es bietet eine grafische Oberfläche, mit der Sie Datenbankobjekte erstellen, verwalten und verwenden können. In diesem Muster stellt pgAdmin eine Verbindung zur Datenbankinstanz RDS for PostgreSQL her und fragt die Daten ab. Alternativ können Sie den psql-Befehlszeilenclient verwenden.

## Best Practices
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-best-practices"></a>
+ Testen Sie Datensatzgrenzen und Edge-Szenarien.
+ Erwägen Sie die Implementierung einer Fehlerbehandlung für Indexbedingungen, die außerhalb der Grenzwerte liegen.
+ Optimieren Sie Abfragen, um das Scannen spärlicher Datensätze zu vermeiden.

## Epen
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-epics"></a>

### Verhalten assoziativer Oracle-Arrays (Quelle)
<a name="oracle-associative-array-behavior-source"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie einen PL/SQL Quellblock in Oracle. | Erstellen Sie in Oracle einen PL/SQL Quellblock, der das folgende assoziative Array verwendet:<pre>DECLARE<br />    TYPE country_codes IS TABLE OF VARCHAR2(100) INDEX BY pls_integer;<br />    cc country_codes;<br />    cc_idx NUMBER := NULL;<br />BEGIN<br />    cc(7) := 'India';<br />    cc(3) := 'UK';<br />    cc(5) := 'USA';<br />    cc(0) := 'China';<br />    cc(-2) := 'Invalid';<br />    dbms_output.put_line('cc_length:' || cc.COUNT);<br />    IF (cc.COUNT > 0) THEN<br />        cc_idx := cc.FIRST;<br />        FOR i IN 1..cc.COUNT LOOP<br />            dbms_output.put_line('cc_idx:' || cc_idx || ' country:' || cc(cc_idx));<br />            cc_idx := cc.next(cc_idx);<br />        END LOOP;<br />    END IF;<br />END;</pre> | DBA | 
| Lass den PL/SQL Block laufen. | Führen Sie den PL/SQL Quellblock in Oracle aus. Wenn zwischen den Indexwerten eines assoziativen Arrays Lücken bestehen, werden in diesen Lücken keine Daten gespeichert. Dadurch kann die Oracle-Schleife nur durch die Indexpositionen iterieren. | DBA | 
| Überprüfen Sie die Ausgabe. | Fünf Elemente wurden in nicht aufeinanderfolgenden Intervallen in das Array (`cc`) eingefügt. Die Anzahl der Arrays wird in der folgenden Ausgabe angezeigt:<pre>cc_length:5<br />cc_idx:-2 country:Invalid<br />cc_idx:0 country:China<br />cc_idx:3 country:UK<br />cc_idx:5 country:USA<br />cc_idx:7 country:India</pre> | DBA | 

### Verhalten assoziativer PostgreSQL-Arrays (Ziel)
<a name="postgresql-associative-array-behavior-target"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie einen PL/pgSQL Zielblock in PostgreSQL. | Erstellen Sie einen PL/pgSQL Zielblock in PostgreSQL, der das folgende assoziative Array verwendet:<pre>DO $$<br />DECLARE<br />    cc character varying(100)[];<br />    cc_idx integer := NULL;<br />BEGIN<br />    cc[7] := 'India';<br />    cc[3] := 'UK';<br />    cc[5] := 'USA';<br />    cc[0] := 'China';<br />    cc[-2] := 'Invalid';<br />    RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1);<br />    IF (ARRAY_LENGTH(cc, 1) > 0) THEN<br />        FOR i IN ARRAY_LOWER(cc, 1)..ARRAY_UPPER(cc, 1)<br />        LOOP<br />            RAISE NOTICE 'cc_idx:% country:%', i, cc[i];<br />        END LOOP;<br />    END IF;<br />END;<br />$$;</pre> | DBA | 
| Lass den PL/pgSQL Block laufen. | Führen Sie den PL/pgSQL Zielblock in PostgreSQL aus. Wenn zwischen den Indexwerten eines assoziativen Arrays Lücken bestehen, werden in diesen Lücken keine Daten gespeichert. Dadurch kann die PostgreSQL-Schleife nur durch die Indexpositionen iterieren. | DBA | 
| Überprüfen Sie die Ausgabe. | Die Array-Länge ist größer als 5, weil sie in den Lücken zwischen den Indexpositionen gespeichert `NULL` wird. Wie in der folgenden Ausgabe gezeigt, führt die Schleife 10 Iterationen durch, um 5 Werte im Array abzurufen.<pre>cc_length:10<br />cc_idx:-2 country:Invalid<br />cc_idx:-1 country:<NULL><br />cc_idx:0 country:China<br />cc_idx:1 country:<NULL><br />cc_idx:2 country:<NULL><br />cc_idx:3 country:UK<br />cc_idx:4 country:<NULL><br />cc_idx:5 country:USA<br />cc_idx:6 country:<NULL><br />cc_idx:7 country:India</pre> | DBA | 

### Emuliert das Verhalten assoziativer Oracle-Arrays
<a name="emulate-oracle-associative-array-behavior"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie einen PL/pgSQL Zielblock mit einem Array und einem benutzerdefinierten Typ. | Um die Leistung zu optimieren und der Funktionalität von Oracle zu entsprechen, können wir einen benutzerdefinierten Typ erstellen, der sowohl Indexpositionen als auch die entsprechenden Daten speichert. Dieser Ansatz reduziert unnötige Iterationen, indem direkte Verknüpfungen zwischen Indizes und Werten beibehalten werden.<pre>DO $$<br />DECLARE<br />    cc country_codes[];<br />    cc_append country_codes := NULL;<br />    i record;<br />BEGIN<br />    cc_append.idx = 7;<br />    cc_append.val = 'India';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 3;<br />    cc_append.val = 'UK';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 5;<br />    cc_append.val = 'USA';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 0;<br />    cc_append.val = 'China';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = - 2;<br />    cc_append.val = 'Invalid';<br />    cc := array_append(cc, cc_append);<br />    RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1);<br />    IF (ARRAY_LENGTH(cc, 1) > 0) THEN<br />        FOR i IN (<br />            SELECT<br />                *<br />            FROM<br />                unnest(cc)<br />            ORDER BY<br />                idx)<br />                LOOP<br />                    RAISE NOTICE 'cc_idx:% country:%', i.idx, i.val;<br />                END LOOP;<br />    END IF;<br />END;<br />$$;</pre> | DBA | 
| Lass den PL/pgSQL Block laufen. | Führen Sie den PL/pgSQL Zielblock aus. Wenn zwischen den Indexwerten eines assoziativen Arrays Lücken bestehen, werden in diesen Lücken keine Daten gespeichert. Dadurch kann die PostgreSQL-Schleife nur durch die Indexpositionen iterieren. | DBA | 
| Überprüfen Sie die Ausgabe. | Wie in der folgenden Ausgabe gezeigt, speichert der benutzerdefinierte Typ nur aufgefüllte Datenelemente, was bedeutet, dass die Länge des Arrays der Anzahl der Werte entspricht. Daher sind `LOOP` Iterationen so optimiert, dass nur vorhandene Daten verarbeitet werden, sodass leere Positionen nicht mehr nachverfolgt werden müssen.<pre>cc_length:5<br />cc_idx:-2 country:Invalid<br />cc_idx:0 country:China<br />cc_idx:3 country:UK<br />cc_idx:5 country:USA<br />cc_idx:7 country:India</pre> | DBA | 

## Fehlerbehebung
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-troubleshooting"></a>


| Problem | Lösung | 
| --- | --- | 
| **Fehler beim Index außerhalb der Grenzen**[See the AWS documentation website for more details](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql.html) | Sie können das Vorhandensein eines Indexes vor dem Zugriff überprüfen, indem Sie einen `WHERE` Klauselfilter für die `idx` Spalte verwenden, wenn Sie die Verschachtelung des Arrays aufheben, oder Sie können Grenzprüfungen in Ihrem Code implementieren. PL/pgSQL  | 
| **Behandlung von NULL-Werten**[See the AWS documentation website for more details](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql.html) | Stellen Sie vor der Verwendung sicher, dass beide Felder des benutzerdefinierten Typs gefüllt sind. `array_append()` Fügen Sie explizite NULL-Prüfungen wie folgt hinzu: `IF cc_append.val IS NOT NULL THEN cc := array_append(cc, cc_append); END IF;` | 

## Zugehörige Ressourcen
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-resources"></a>

**AWS Dokumentation**
+ [AWS Datenbank-Blog](https://aws.amazon.com/blogs/database/)
+ [Leitfaden für die Migration von Oracle nach Aurora PostgreSQL](https://docs.aws.amazon.com/dms/latest/oracle-to-aurora-postgresql-migration-playbook/chap-oracle-aurora-pg.html)

**Weitere Dokumentation**
+ [Assoziative Oracle-Arrays](https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/associative-arrays.html#GUID-8060F01F-B53B-48D4-9239-7EA8461C2170)
+ [PostgreSQL-Array-Funktionen und -Operatoren](https://www.postgresql.org/docs/current/functions-array.html)
+ [Benutzerdefinierte PostgreSQL-Typen](https://www.postgresql.org/docs/current/sql-createtype.html)

## Zusätzliche Informationen
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-additional"></a>

*Leistungsaspekte*
+ Dieser Ansatz reduziert den Iterationsaufwand für Arrays mit geringer Dichte im Vergleich zu nativen PostgreSQL-Arrays mit NULL-Platzhaltern um 50% oder mehr.
+ Die Speichereffizienz verbessert sich, da nur tatsächliche Daten gespeichert werden, keine leeren Indexpositionen.

*Hinweise zur Kompatibilität*
+ Dieses Muster behält die Sparse-Array-Semantik von Oracle bei und verwendet gleichzeitig die nativen Array-Funktionen von PostgreSQL.
+ Die Lösung ist mit allen PostgreSQL-Versionen kompatibel, die benutzerdefinierte zusammengesetzte Typen unterstützen.