View a markdown version of this page

Migrez les packages Pragma Oracle SERIALLY_REUSERABLE vers Amazon Aurora ou Amazon RDS for PostgreSQL - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Migrez les packages Pragma Oracle SERIALLY_REUSERABLE vers Amazon Aurora ou Amazon RDS for PostgreSQL

Vinay Paladi, Amazon Web Services

Résumé

Ce modèle fournit une approche étape par étape pour la migration des packages Oracle qui utilisent le pragma SERIALLY_REUSERABLE vers Amazon PostgreSQL-Compatible Aurora Edition ou Amazon RDS for AWS PostgreSQL on, tout en conservant les fonctionnalités d'origine.

Le PRAGMA SERIALLY_REUSERABLE indique que l'état du package n'est nécessaire que pendant la durée d'un appel au serveur (par exemple, un bloc PL/SQL anonyme ou un appel de procédure stockée via un lien de base de données). Après cet appel, le stockage des variables du package peut être réutilisé, réduisant ainsi la consommation de mémoire.

PostgreSQL ne supporte pas nativement le concept de SERIALLY_REUSERABLE Pragma. Pour obtenir des fonctionnalités équivalentes, ce modèle utilise une approche de fonction wrapper combinée à la fonctionnalité AWS Database Migration Service (AWS DMS) Schema Conversion (AWS DMS SC) pour migrer la structure du package. L'exemple de script fourni montre comment préserver le comportement de réinitialisation à chaque appel dans PostgreSQL.

Pour plus d'informations, consultez SERIALLY_REUSERABLE Pragma dans la documentation Oracle.

Conditions préalables et limitations

  • Un actif Compte AWS

  • Accès au service de conversion de AWS DMS schéma

  • Une base de données Amazon Aurora PostgreSQL-Compatible Edition ou une base de données Amazon RDS for PostgreSQL

  • Base de données Oracle version 10g ou ultérieure

Architecture

Pile technologique source

  • On-premises Base de données Oracle

Pile technologique cible

Architecture de migration

Migrez les packages Pragma Oracle SERIALLY_REUSERABLE vers Amazon Aurora ou Amazon RDS for PostgreSQL

Outils

Services AWS

Autres outils

  • pgAdmin est un outil de gestion open source pour PostgreSQL. Il fournit une interface graphique qui vous permet de créer, de gérer et d'utiliser des objets de base de données.

Bonnes pratiques

  • Utilisez-le toujours reset_vars = 1 pour les appels de haut niveau et reset_vars = 0 pour les appels secondaires internes.

  • Conservez toutes les valeurs par défaut de la $init fonction en tant que source unique de vérité.

  • Faites correspondre les noms des variables Oracle dans PostgreSQL à des fins de traçabilité.

  • Validez en comparant les résultats d'Oracle DBMS_OUTPUT à ceux de RAISE NOTICE PostgreSQL.

  • Effectuez des tests dans le cadre de sessions PostgreSQL distinctes pour confirmer que les variables sont réinitialisées entre les appels.

Épopées

Sous-tâcheDescriptionCompétences requises

Configurez AWS DMS SC.

Configurez la AWS DMS connectivité à la base de données source. Pour plus d'informations, consultez la section Conversion de schémas de base de données à l'aide de la conversion de schéma DMS.

DBA, Développeur

Convertissez le script.

Utilisez AWS DMS SC pour convertir le package Oracle en sélectionnant la base de données cible Aurora PostgreSQL-Compatible.

DBA, Développeur

Enregistrez les fichiers .sql.

Avant d'enregistrer le fichier .sql, modifiez l'option Paramètres du projet dans AWS DMS SC sur Fichier unique par étape. Cela permet de AWS DMS séparer le fichier .sql en plusieurs fichiers .sql en fonction du type d'objet.

DBA, Développeur

Changez le code.

Ouvrez la init fonction générée par AWS DMS SC et modifiez-la comme indiqué dans l'exemple de la section Informations supplémentaires. Il ajoutera une variable pour obtenir la fonctionnalitéreset_vars = 0.

DBA, Développeur

Testez la conversion.

Déployez la init fonction dans la PostgreSQL-Compatible base de données Aurora et testez les résultats.

DBA, Développeur

Résolution des problèmes

ProblèmeSolution

Erreur « Le champ n'existe pas » lors de l'accès aux variables du package.

Assurez-vous que la condition de $init fonction utilise IF v_need_init ou de reset_vars = 1 telle sorte que les variables soient toujours créées lors du premier accès à une session.

Les variables ne sont pas réinitialisées entre les appels de haut niveau ou se réinitialisent de manière inattendue lors des sous-appels internes.

Utilisez-le reset_vars = 1 pour les appels directs de haut niveau et passez-le reset_vars = 0 pour les appels internes de fonction à fonction.

Ressources connexes

Informations supplémentaires

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