

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 Oracle SERIALLY\_REUSABLE Pragma-Pakete zu Amazon Aurora oder Amazon RDS for PostgreSQL
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql"></a>

*Vinay Paladi, Amazon Web Services*

## Zusammenfassung
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-summary"></a>

Dieses Muster bietet einen schrittweisen Ansatz für die Migration von Oracle-Paketen, die das SERIALLY\_REUSABLE Pragma verwenden, auf Amazon Aurora PostgreSQL-Compatible Edition oder Amazon RDS for PostgreSQL unter AWS Beibehaltung der ursprünglichen Funktionalität.

Das PRAGMA SERIALLY\_REUSABLE gibt an, dass der Paketstatus nur für die Dauer eines Serveraufrufs benötigt wird (z. B. ein PL/SQL anonymer Block oder ein Aufruf einer gespeicherten Prozedur über einen Datenbank-Link). Nach diesem Aufruf kann der Speicher für die Paketvariablen wiederverwendet werden, wodurch der Speicherverbrauch reduziert wird.

PostgreSQL unterstützt das Konzept von SERIALLY\_REUSABLE Pragma nicht nativ. Um eine gleichwertige Funktionalität zu erreichen, verwendet dieses Muster einen Wrapper-Funktionsansatz in Kombination mit der AWS Database Migration Service (AWS DMS) [Schema Conversion (AWS DMS SC](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html)) -Funktion, um die Paketstruktur zu migrieren. Das bereitgestellte Beispielskript zeigt, wie das Reset-on-Each-Call-Verhalten in PostgreSQL beibehalten wird.

[Weitere Informationen finden Sie unter SERIALLY\_REUSABLE Pragma in der Oracle-Dokumentation.](https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/SERIALLY_REUSABLE-pragma.html)

## Voraussetzungen und Einschränkungen
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-prereqs"></a>
+ Ein aktiver AWS-Konto
+ Zugriff auf den AWS DMS Schema Conversion Service
+ Eine Amazon Aurora PostgreSQL-Compatible Edition-Datenbank oder eine Amazon RDS for PostgreSQL PostgreSQL-Datenbank
+ Oracle-Datenbank Version 10g oder höher

## Architektur
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-architecture"></a>

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

**Zieltechnologie-Stack**
+ [Aurora PostgreSQL-Compatible](https://aws.amazon.com/rds/aurora/details/postgresql-details/) oder Amazon RDS for PostgreSQL
+ AWS DMS Schemakonvertierung

**Migrationsarchitektur**

![Migrieren Sie Oracle SERIALLY_REUSABLE Pragma-Pakete zu Amazon Aurora oder Amazon RDS for PostgreSQL](https://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/fe3c45d2-6ea4-43b5-adb1-18f068f126b9/images/955ed078-0941-4ae6-b56e-964379a29365.jpeg)


## Tools
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-tools"></a>

**AWS-Services**
+ [AWS Database Migration Service (AWS DMS) Die Schemakonvertierung](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) macht Datenbankmigrationen zwischen verschiedenen Datenbanktypen vorhersehbarer. Verwenden Sie es, um die Komplexität Ihrer Migration für Ihren Quelldatenanbieter zu beurteilen und Datenbankschemas und Codeobjekte zu konvertieren. Sie können dann den konvertierten Code auf Ihre Zieldatenbank anwenden.
+ [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 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

**Andere Tools**
+ [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.

## Bewährte Methoden
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-best-practices"></a>
+ Wird immer `reset_vars = 1` für Anrufe auf oberster Ebene und `reset_vars = 0` für interne Unteranrufe verwendet.
+ Behalten Sie alle Standardwerte in der `$init` Funktion als zentrale Informationsquelle bei.
+ Ordnen Sie Oracle-Variablennamen in PostgreSQL aus Gründen der Rückverfolgbarkeit zu.
+ Überprüfen Sie, indem Sie die Oracle- `DBMS_OUTPUT` mit der PostgreSQL-Ausgabe `RAISE NOTICE` vergleichen.
+ Testen Sie in separaten PostgreSQL-Sitzungen, um zu bestätigen, dass Variablen zwischen Aufrufen zurückgesetzt werden.

## Epen
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-epics"></a>

### Migrieren Sie das Oracle-Paket mithilfe von AWS DMS SC
<a name="migrate-the-oracle-package-by-using-dms-sc"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Richten Sie AWS DMS SC ein. | Konfigurieren Sie die AWS DMS Konnektivität zur Quelldatenbank. Weitere Informationen finden Sie unter [Datenbankschemas mithilfe der DMS-Schemakonvertierung konvertieren](https://docs.aws.amazon.com/dms/latest/userguide/getting-started.html). | DBA, Entwickler | 
| Konvertiert das Skript. | Verwenden Sie AWS DMS SC, um das Oracle-Paket zu konvertieren, indem Sie die Zieldatenbank als Aurora auswählen PostgreSQL-Compatible. | DBA, Entwickler | 
| Speichern Sie die .sql-Dateien. | Bevor Sie die SQL-Datei speichern, ändern Sie die Option **Projekteinstellungen** in AWS DMS SC auf Eine **Datei pro Phase**. Dadurch wird die .sql-Datei je AWS DMS nach Objekttyp in mehrere .sql-Dateien aufgeteilt. | DBA, Entwickler | 
| Ändern Sie den Code. | Öffnen Sie die von AWS DMS SC generierte `init` Funktion und ändern Sie sie, wie im Beispiel im Abschnitt *Zusätzliche Informationen* gezeigt. Es wird eine Variable hinzugefügt, um die Funktionalität zu erreichen`reset_vars = 0`. | DBA, Entwickler | 
| Testen Sie die Konvertierung. | Stellen Sie die `init` Funktion in der PostgreSQL-Compatible Aurora-Datenbank bereit und testen Sie die Ergebnisse. | DBA, Entwickler | 

## Fehlerbehebung
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-troubleshooting"></a>


| Problem | Lösung | 
| --- | --- | 
| Fehler „Feld existiert nicht“ beim Zugriff auf Paketvariablen. | Stellen Sie sicher, dass die `$init` Funktionsbedingung `IF v_need_init` oder verwendet, `reset_vars = 1` dass Variablen immer beim ersten Zugriff in einer Sitzung erstellt werden. | 
| Variablen werden nicht zwischen Aufrufen der obersten Ebene zurückgesetzt oder bei internen Unteraufrufen unerwartet zurückgesetzt. | Wird `reset_vars = 1` für direkte Aufrufe der obersten Ebene verwendet und für interne Aufrufe von Funktion zu Funktion übergeben. `reset_vars = 0` | 

## Zugehörige Ressourcen
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-resources"></a>
+ [AWS DMS Schemakonvertierung](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html)
+ [Amazon RDS](https://aws.amazon.com/rds/)
+ [Funktionen von Amazon Aurora](https://aws.amazon.com/rds/aurora/postgresql-features/)
+ [SERIALLY\_REUSABLE Pragma](https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/seriallyreusable_pragma.htm#LNPLS01346)

## Zusätzliche Informationen
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-additional"></a>

```
-------Source Oracle Code:
CREATE OR REPLACE PACKAGE test_pkg_var IS
  PRAGMA SERIALLY_REUSABLE;
  PROCEDURE function_1(test_id NUMBER);
  PROCEDURE function_2(test_id NUMBER);
END;
/
CREATE OR REPLACE PACKAGE BODY test_pkg_var IS
  PRAGMA SERIALLY_REUSABLE;
  v_char VARCHAR2(20) := 'DEFAULT_VALUE';
  v_num NUMBER := 123;
  PROCEDURE function_2(test_id NUMBER) IS
  BEGIN dbms_output.put_line('function_2 => v_char=' || v_char || ', v_num=' || v_num); END;
  PROCEDURE function_1(test_id NUMBER) IS
  BEGIN
    dbms_output.put_line('function_1 => v_char=' || v_char || ', v_num=' || v_num);
    v_char := 'MODIFIED_VALUE';
    dbms_output.put_line('function_1 => v_char after update=' || v_char);
    function_2(0);
  END;
END test_pkg_var;
/
SET SERVEROUTPUT ON
EXEC test_pkg_var.function_1(1);
EXEC test_pkg_var.function_2(1);
------Target PostgreSQL Code:
CREATE SCHEMA IF NOT EXISTS testoracle;
CREATE OR REPLACE FUNCTION testoracle.test_pkg_var$init(reset_vars IN INTEGER DEFAULT 0) RETURNS void AS $BODY$
DECLARE v_need_init BOOLEAN;
BEGIN
  v_need_init := aws_oracle_ext.packageinitialize(proutinename => 'testoracle.test_pkg_var');
  IF v_need_init OR reset_vars = 1 THEN
    PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'DEFAULT_VALUE'::CHARACTER VARYING(20));
    PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', pval => 123);
  END IF;
END; $BODY$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_1(reset_vars INT DEFAULT 1) AS $BODY$
BEGIN
  PERFORM testoracle.test_pkg_var$init(reset_vars);
  RAISE NOTICE 'function_1 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION);
  PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'MODIFIED_VALUE'::CHARACTER VARYING(20));
  RAISE NOTICE 'function_1 => v_char after update=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20));
  CALL testoracle.test_pkg_var$function_2(0);
END; $BODY$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_2(reset_vars INT DEFAULT 1) AS $BODY$
BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars);
  RAISE NOTICE 'function_2 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION);
END; $BODY$ LANGUAGE plpgsql;
CALL testoracle.test_pkg_var$function_1(1); -- loads defaults, sets v_char='MODIFIED_VALUE', function_2 sees 'MODIFIED_VALUE'
CALL testoracle.test_pkg_var$function_2(1); -- new transcation: PRAGMA reset, sees 'DEFAULT_VALUE'
```