View a markdown version of this page

Esegui la migrazione dei pacchetti Oracle SERIALLY_REUSABLE Pragma in Amazon Aurora o Amazon RDS for PostgreSQL - Prontuario AWS

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

Architettura di migrazione

Esegui la migrazione dei pacchetti Oracle SERIALLY_REUSABLE Pragma in Amazon Aurora o Amazon RDS for PostgreSQL

Tools (Strumenti)

Servizi 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 = 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 PostgreSQLRAISE NOTICE.

  • Esegui il test in sessioni PostgreSQL separate per confermare la reimpostazione delle variabili tra una chiamata e l'altra.

Epiche

OperazioneDescriptionCompetenze 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 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

ProblemaSoluzione

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

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'