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
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
Aurora PostgreSQL-Compatible
ou Amazon RDS pour PostgreSQL AWS DMS Conversion de schéma
Architecture de migration

Outils
Services AWS
AWS Database Migration Service (AWS DMS) La conversion de schéma rend les migrations de bases de données entre différents types de bases de données plus prévisibles. Utilisez-le pour évaluer la complexité de votre migration pour votre fournisseur de données source et pour convertir des schémas de base de données et des objets de code. Vous pouvez alors appliquer le code converti à la base de données cible.
Amazon Aurora PostgreSQL-Compatible Edition est un moteur de base de données ACID-compliant relationnelle entièrement géré qui vous aide à configurer, exploiter et dimensionner les déploiements PostgreSQL.
Amazon Relational Database Service (Amazon RDS) pour PostgreSQL vous aide à configurer, exploiter et dimensionner une base de données relationnelle PostgreSQL dans le. AWS Cloud
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 = 1pour les appels de haut niveau etreset_vars = 0pour les appels secondaires internes.Conservez toutes les valeurs par défaut de la
$initfonction 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 deRAISE NOTICEPostgreSQL.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âche | Description | Compé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 | DBA, Développeur |
Testez la conversion. | Déployez la | DBA, Développeur |
Résolution des problèmes
| Problème | Solution |
|---|---|
Erreur « Le champ n'existe pas » lors de l'accès aux variables du package. | Assurez-vous que la condition de |
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 |
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'