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

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

Environnement : PoC ou pilote

Source : Base de données relationnelle

Cible : RDS /Aurora Postgresql

Type R : Replateforme

Charge de travail : Oracle

Technologies : bases de données ; migration

AWSservices : Amazon Aurora ; Amazon RDS ; AWS SCT

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 AWS base de données SQL compatibles Postgre suivants :

  • Amazon Relational Database Service (RDSAmazon) pour Postgre SQL

  • Édition compatible avec Amazon Aurora Postgre SQL

Postgre SQL ne prend pas en charge les variables de OUT liaison. Pour obtenir les mêmes fonctionnalités dans vos instructions Python, vous pouvez créer une SQL fonction PL/pg 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 (AWSSCT).

Remarque : 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 la EXECUTEIMMEDIATEdéclaration contenue 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 for Postgre ou une SQL instance de base de données SQL compatible avec Aurora Postgre

Architecture cible

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

La migration des variables de base de OUT données Oracle vers une base de données compatible PostgreSQL. AWS

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

  1. AWSSCTconvertit 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 SQL compatible AWS Postgre cible.

  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 Postgre SQL -Compatible Edition est un moteur de base de données relationnelle entièrement géré ACID et conforme qui vous aide à configurer, exploiter et dimensionner les déploiements Postgre. SQL

  • Amazon Relational Database Service (RDSAmazon) pour SQL Postgre vous aide à configurer, exploiter et dimensionner une base de données relationnelle SQL Postgre dans le cloud. AWS

  • AWSSchema Conversion Tool (AWSSCT) 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.

  • pgAdminest un outil de gestion open source pour SQL Postgre. 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 SQL compatible AWS Postgre.

Après avoir créé votre instance de base de données, vous pouvez utiliser n'importe quelle application SQL client standard pour vous connecter à une base de données de votre cluster de bases de données. Par exemple, vous pouvez l'utiliser pgAdminpour 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 d'SQLemballage PL/pG 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 CREATEFUNCTIONla SQL documentation Postgre.

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 Postgre SQL search_path 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 PostgreSQL.

Ingénieur en migration

Ressources connexes

Informations supplémentaires

Exemple de fonction PL/pG SQL

/* 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 ; $$