

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
+ Ein AWS Identity and Access Management (IAM-) Benutzer mit Administratorrechten.
+ Eine Instance, die mit Amazon RDS oder Aurora PostgreSQL kompatibel ist.
+ Ein grundlegendes Verständnis von relationalen Datenbanken.

**Einschränkungen**
+ Einige AWS-Services sind nicht in allen AWS-Regionen verfügbar. 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 12c EE 12.2

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

**Quelltechnologie-Stack**
+ Lokale Oracle-Datenbank

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

**Zielarchitektur**

![\[alt text not found\]](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 EC2 Amazon-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-konforme 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 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 out-of-bounds Indexbedingungen.
+ 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 Oracle-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 Oracle-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 | 

## 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)