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
Vinay Paladi, Amazon Web Services
Riepilogo
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 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.
Prerequisiti e limitazioni
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
Stack tecnologico di origine
On-premises database Oracle
Stack tecnologico Target
Aurora PostgreSQL-Compatible
o Amazon RDS per PostgreSQL AWS DMS Conversione dello schema
Architettura di migrazione

Tools (Strumenti)
Servizi AWS
AWS Database Migration Service (AWS DMS) La conversione dello schema 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 è 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 ti aiuta a configurare, gestire e scalare un database relazionale PostgreSQL in. Cloud AWS
Altri strumenti
pgAdmin
è uno strumento di gestione open source per PostgreSQL. Fornisce un'interfaccia grafica che consente di creare, gestire e utilizzare oggetti di database.
Best practice
Utilizzalo sempre
reset_vars = 1per le chiamate di primo livello ereset_vars = 0per le sottochiamate interne.Mantieni tutti i valori predefiniti nella
$initfunzione come unica fonte di verità.Abbina i nomi delle variabili Oracle in PostgreSQL per la tracciabilità.
Convalida confrontando l'output di Oracle
DBMS_OUTPUTcon quello di PostgreSQLRAISE NOTICE.Esegui il test in sessioni PostgreSQL separate per confermare la reimpostazione delle variabili tra una chiamata e l'altra.
Epiche
| 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 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 | DBA, Sviluppatore |
Prova la conversione. | Implementa la | DBA, Sviluppatore |
Risoluzione dei problemi
| Problema | Soluzione |
|---|---|
Errore «Il campo non esiste» durante l'accesso alle variabili del pacchetto. | Assicurati che la condizione della |
Le variabili non si ripristinano tra le chiamate di primo livello o si ripristinano in modo imprevisto durante le sottochiamate interne. | Utilizzatelo |
Risorse correlate
Informazioni aggiuntive
-------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'