

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à.

# Esegui la migrazione dei pacchetti Oracle SERIALLY\_REUSABLE Pragma in Amazon Aurora o Amazon RDS for PostgreSQL
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql"></a>

*Vinay Paladi, Amazon Web Services*

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

Questo modello fornisce un approccio graduale per la migrazione di pacchetti Oracle che utilizzano SERIALLY\_REUSABLE Pragma su Amazon Aurora Edition PostgreSQL-Compatible o Amazon RDS for PostgreSQL, mantenendo al contempo la funzionalità originale. AWS

Il PRAGMA SERIALLY\_REUSABLE indica che lo stato del pacchetto è necessario solo per la durata di una chiamata al server (ad esempio, un blocco anonimo o una chiamata di procedura memorizzata tramite un collegamento al database). PL/SQL Dopo questa chiamata, lo spazio di archiviazione per le variabili del pacchetto può essere riutilizzato, riducendo il consumo di memoria.

PostgreSQL non supporta nativamente il concetto di SERIALLY\_REUSABLE Pragma. [Per ottenere funzionalità equivalenti, questo modello utilizza un approccio basato sulla funzione wrapper combinato con la funzionalità () Schema Conversion AWS Database Migration Service (SC AWS DMS) per migrare la struttura del pacchetto.AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) Lo script di esempio fornito dimostra come preservare il comportamento reset-on-each-call in PostgreSQL.

[Per ulteriori informazioni, consulta SERIALLY\_REUSABLE Pragma nella documentazione di Oracle.](https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/SERIALLY_REUSABLE-pragma.html)

## Prerequisiti e limitazioni
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-prereqs"></a>
+ Un attivo Account AWS
+ Accesso al servizio di conversione AWS DMS dello schema
+ Un database Amazon Aurora PostgreSQL-Compatible Edition o un database Amazon RDS per PostgreSQL
+ Database Oracle versione 10g o successiva

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

**Stack tecnologico di origine**
+ On-premises database Oracle

**Stack tecnologico Target**
+ [Aurora PostgreSQL-Compatible](https://aws.amazon.com/rds/aurora/details/postgresql-details/) o Amazon RDS per PostgreSQL
+ AWS DMS Conversione dello schema

**Architettura di migrazione**

![Esegui la migrazione dei pacchetti Oracle SERIALLY_REUSABLE Pragma in Amazon Aurora o Amazon RDS for PostgreSQL](https://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/fe3c45d2-6ea4-43b5-adb1-18f068f126b9/images/955ed078-0941-4ae6-b56e-964379a29365.jpeg)


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

**Servizi AWS**
+ [AWS Database Migration Service (AWS DMS) La conversione dello schema](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) rende più prevedibili le migrazioni di database tra diversi tipi di database. Utilizzatela per valutare la complessità della migrazione per il vostro fornitore di dati di origine e per convertire schemi di database e oggetti di codice. Puoi quindi applicare il codice convertito al database di destinazione.
+ [Amazon Aurora PostgreSQL-Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) è un motore di database ACID-compliant relazionale completamente gestito che ti aiuta a configurare, gestire e scalare le distribuzioni PostgreSQL.
+ [Amazon Relational Database Service (Amazon RDS) per PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) ti aiuta a configurare, gestire e scalare un database relazionale PostgreSQL in. Cloud AWS

**Altri strumenti**
+ [pgAdmin](https://www.pgadmin.org/) è uno strumento di gestione open source per PostgreSQL. Fornisce un'interfaccia grafica che consente di creare, gestire e utilizzare oggetti di database.

## Best practice
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-best-practices"></a>
+ Utilizzalo sempre `reset_vars = 1` per le chiamate di primo livello e `reset_vars = 0` per le sottochiamate interne.
+ Mantieni tutti i valori predefiniti nella `$init` funzione come unica fonte di verità.
+ Abbina i nomi delle variabili Oracle in PostgreSQL per la tracciabilità.
+ Convalida confrontando l'output di Oracle `DBMS_OUTPUT` con quello di PostgreSQL`RAISE NOTICE`.
+ Esegui il test in sessioni PostgreSQL separate per confermare la reimpostazione delle variabili tra una chiamata e l'altra.

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

### Migra il pacchetto Oracle utilizzando AWS DMS SC
<a name="migrate-the-oracle-package-by-using-dms-sc"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Configura AWS DMS SC. | Configura la AWS DMS connettività al database di origine. Per ulteriori informazioni, vedere [Conversione degli schemi di database utilizzando DMS](https://docs.aws.amazon.com/dms/latest/userguide/getting-started.html) Schema Conversion. | DBA, Sviluppatore | 
| Convertire lo script. | Usa AWS DMS SC per convertire il pacchetto Oracle selezionando il database di destinazione come Aurora PostgreSQL-Compatible. | DBA, Sviluppatore | 
| Salva i file.sql. | Prima di salvare il file.sql, modificate l'opzione **Impostazioni progetto** in AWS DMS SC su **File singolo per fase.** Questa configurazione consente AWS DMS di separare il file.sql in più file.sql in base al tipo di oggetto. | DBA, Sviluppatore | 
| Cambia il codice. | Aprite la `init` funzione generata da AWS DMS SC e modificatela come mostrato nell'esempio nella sezione *Informazioni aggiuntive*. Aggiungerà una variabile per ottenere la funzionalità`reset_vars = 0`. | DBA, Sviluppatore | 
| Prova la conversione. | Implementa la `init` funzione nel database PostgreSQL-Compatible Aurora e verifica i risultati. | DBA, Sviluppatore | 

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


| Problema | Soluzione | 
| --- | --- | 
| Errore «Il campo non esiste» durante l'accesso alle variabili del pacchetto. | Assicurati che la condizione della `$init` funzione utilizzi `IF v_need_init` o meno `reset_vars = 1` che le variabili vengano sempre create al primo accesso in una sessione. | 
| Le variabili non si ripristinano tra le chiamate di primo livello o si ripristinano in modo imprevisto durante le sottochiamate interne. | Utilizzatelo `reset_vars = 1` per chiamate dirette di primo livello e passate per chiamate interne da funzione a funzione. `reset_vars = 0` | 

## Risorse correlate
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-resources"></a>
+ [AWS DMS Conversione dello schema](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html)
+ [Amazon RDS](https://aws.amazon.com/rds/)
+ [Caratteristiche di 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)

## Informazioni aggiuntive
<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'
```