Migrer les variables de liaison Oracle OUT vers une base de données 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.

Migrer les variables de liaison Oracle OUT vers une base de données PostgreSQL

Créée par Bikash Chandra Rout (AWS) et Vinay Paladi (AWS)

Récapitulatif

Ce modèle montre comment migrer les variables de OUT liaison de base de données Oracle vers l'un des services de base de données AWS compatibles avec PostgreSQL suivants :

  • Amazon Relational Database Service (Amazon RDS) pour PostgreSQL

  • Amazon Aurora PostgreSQL-Compatible Edition

PostgreSQL ne prend pas OUT en charge les variables de liaison. Pour obtenir les mêmes fonctionnalités dans vos instructions Python, vous pouvez créer une fonction PL/pgSQL personnalisée qui utilise plutôt les variables de SETpackage GET et. Pour appliquer ces variables, l'exemple de script de fonction wrapper fourni dans ce modèle utilise un pack d'extension AWS Schema Conversion Tool (AWS SCT).

Note

Si l'EXECUTE IMMEDIATEinstruction Oracle est une SELECT instruction qui peut renvoyer une ligne au maximum, il est recommandé de procéder comme suit :

  • Insérez des variables de OUT liaison (définitions) dans la INTO clause

  • Insérez des variables de IN liaison dans la USING clause

Pour plus d'informations, consultez l'instruction EXECUTE IMMEDIATE dans la documentation Oracle.

Conditions préalables et limitations

Prérequis

Architecture

Pile technologique source

  • Base de données Oracle Database 10g (ou version ultérieure) sur site 

Pile technologique cible

  • Une instance de base de données Amazon RDS pour PostgreSQL ou une instance de base de données compatible avec Aurora PostgreSQL

Architecture cible

Le schéma suivant montre un exemple de flux de travail pour la migration des variables de OUT liaison de base de données Oracle vers une base de données AWS compatible avec PostgreSQL.

La migration d'Oracle Database OUT lie des variables vers une base de données AWS compatible avec PostgreSQL.

Le schéma suivant illustre le flux de travail suivant :

  1. AWS SCT convertit le schéma de base de données source et la majorité du code personnalisé dans un format compatible avec la base de données AWS cible compatible avec PostgreSQL.

  2. Tous les objets de base de données qui ne peuvent pas être convertis automatiquement sont signalés par la fonction PL/pgSQL. Les objets marqués sont ensuite convertis manuellement pour terminer la migration.

Outils

  • Amazon Aurora PostgreSQL Compatible Edition est un moteur de base de données relationnelle entièrement géré et compatible ACID 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 cloud AWS.

  • AWS Schema Conversion Tool (AWS SCT) prend en charge les migrations de bases de données hétérogènes en convertissant automatiquement le schéma de base de données source et la majorité du code personnalisé dans un format compatible avec la base de données cible.

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

Épopées

TâcheDescriptionCompétences requises

Connectez-vous à votre base de données AWS compatible avec PostgreSQL.

Après avoir créé votre instance de base de données, vous pouvez utiliser n'importe quelle application client SQL standard pour vous connecter à une base de données de votre cluster de bases de données. Par exemple, vous pouvez utiliser pgAdmin pour vous connecter à votre instance de base de données.

Pour plus d'informations, consultez l'une des rubriques suivantes :

Ingénieur en migration

Ajoutez l'exemple de script de fonction wrapper issu de ce modèle au schéma principal de la base de données cible.

Copiez l'exemple de script de fonction wrapper PL/pgSQL depuis la section Informations supplémentaires de ce modèle. Ajoutez ensuite la fonction au schéma principal de la base de données cible.

Pour plus d'informations, consultez CREATE FUNCTION dans la documentation PostgreSQL.

Ingénieur en migration

(Facultatif) Mettez à jour le chemin de recherche dans le schéma principal de la base de données cible afin d'inclure le schéma Test_PG.

Pour améliorer les performances, vous pouvez mettre à jour la variable search_path de PostgreSQL afin qu'elle inclue le nom du schéma Test_PG. Si vous incluez le nom du schéma dans le chemin de recherche, il n'est pas nécessaire de le spécifier chaque fois que vous appelez la fonction PL/pgSQL.

Pour plus d'informations, consultez la section 5.9.3 Le chemin de recherche du schéma dans la documentation de PostgreSQL.

Ingénieur en migration

Ressources connexes

Informations supplémentaires

Exemple de fonction PL/pgSQL

/* Oracle */ CREATE or replace PROCEDURE test_pg.calc_stats_new1 ( a NUMBER, b NUMBER, result out NUMBER ) IS BEGIN result:=a+b; END; / /* Testing */ set serveroutput on DECLARE a NUMBER := 4; b NUMBER := 7; plsql_block VARCHAR2(100); output number; BEGIN plsql_block := 'BEGIN test_pg.calc_stats_new1(:a, :b,:output); END;'; EXECUTE IMMEDIATE plsql_block USING a, b,out output; -- calc_stats(a, a, b, a) DBMS_OUTPUT.PUT_LINE('output:'||output); END; output:11 PL/SQL procedure successfully completed. --Postgres-- /* Example : 1 */ CREATE OR REPLACE FUNCTION test_pg.calc_stats_new1( w integer, x integer ) RETURNS integer AS $BODY$ begin return w + x ; end; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION aws_oracle_ext.set_package_variable( package_name name, variable_name name, variable_value anyelement ) RETURNS void LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ begin perform set_config ( format( '%s.%s',package_name, variable_name ) , variable_value::text , false ); end; $BODY$; CREATE OR REPLACE FUNCTION aws_oracle_ext.get_package_variable_record( package_name name, record_name name ) RETURNS text LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ begin execute 'select ' || package_name || '$Init()'; return aws_oracle_ext.get_package_variable ( package_name := package_name , variable_name := record_name || '$REC' ); end; $BODY$; --init()-- CREATE OR REPLACE FUNCTION test_pg.init() RETURNS void AS $BODY$ BEGIN if aws_oracle_ext.is_package_initialized('test_pg' ) then return; end if; perform aws_oracle_ext.set_package_initialized ('test_pg' ); PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_output', NULL::INTEGER); PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_status', NULL::text); END; $BODY$ LANGUAGE plpgsql; /* callable for 1st Example */ DO $$ declare v_sql text; v_output_loc int; a integer :=1; b integer :=2; BEGIN perform test_pg.init(); --raise notice 'v_sql %',v_sql; execute 'do $a$ declare v_output_l int; begin select * from test_pg.calc_stats_new1('||a||','||b||') into v_output_l; PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_output'', v_output_l) ; end; $a$' ; v_output_loc := aws_oracle_ext.get_package_variable('test_pg', 'v_output'); raise notice 'v_output_loc %',v_output_loc; END ; $$ /*In above Postgres example we have set the value of v_output using v_output_l in the dynamic anonymous block to mimic the behaviour of oracle out-bind variable .*/ --Postgres Example : 2 -- CREATE OR REPLACE FUNCTION test_pg.calc_stats_new2( w integer, x integer, inout status text, out result integer) AS $BODY$ DECLARE begin result := w + x ; status := 'ok'; end; $BODY$ LANGUAGE plpgsql; /* callable for 2nd Example */ DO $$ declare v_sql text; v_output_loc int; v_staus text:= 'no'; a integer :=1; b integer :=2; BEGIN perform test_pg.init(); execute 'do $a$ declare v_output_l int; v_status_l text; begin select * from test_pg.calc_stats_new2('||a||','||b||','''||v_staus||''') into v_status_l,v_output_l; PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_output'', v_output_l) ; PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_status'', v_status_l) ; end; $a$' ; v_output_loc := aws_oracle_ext.get_package_variable('test_pg', 'v_output'); v_staus := aws_oracle_ext.get_package_variable('test_pg', 'v_status'); raise notice 'v_output_loc %',v_output_loc; raise notice 'v_staus %',v_staus; END ; $$