fr en

Alimenter une table locale avec les données présentes sur un système distant

Objectifs :

Alimenter une table locale avec des données récupérées depuis un système distant, c’est à dire : présente sur une autre machine.

Cette action est souvent nécessaire pour :

  • Récupérer les données d’une machine de production pour les dupliquer sur un environnement de recette afin de constituer un jeu d’essai.
  • Initialiser des tables de paramétrages d’une machine de production à partir du paramétrage mis en place sur une machine de développement.

Ces actions sont réalisables via des transferts de SAVF avec des SAVOBJ, des RSTOBJ et autres commandes. Mais cela devient vite fastidieux lorsqu’il faut sélectionner une partie seulement des données d’une table.

SQL permet de faire la même chose de façon beaucoup plus simple.

Requêter une table distante :

Pour requêter une table présente sur un système distant il faut préfixer la bibliothèque de la table par le nom du système distant concerné :

SELECTFROM nom_systeme_distant.nom_bibliotheque.nom_table;

Insérer les données d'une table distante dans une table locale :

Si on tente de faire directement une insertion des données distantes dans une table locale : SQL va retourner une erreur -512 indiquant que l’instruction fait référence à des objets de plusieurs bases de données.

INSERT INTO ma_bibliotheque_locale.ma_table_locale (zone_1, zone2)
SELECT zone_1, zone_2 FROM mon_systeme_distant.ma_bibliotheque_distante.ma_table_distante; => ERREUR SQLCODE -512

Il faut utiliser une CTE COMMON TABLE EXPRESSIONS.

Avec une CTE, on créé une table temporaire locale contenant les données sélectionnées dans une table distante, et c’est cette nouvelle table locale qui est utilisée pour insérer les données dans notre ta cible (locale également).

INSERT INTO ma_bibliotheque_locale.ma_table_locale (zone_1, zone2)
WITH ma_table_CTE (zone_1, zone_2) AS ( SELECT zone_1, zone_2 FROM mon_systeme_distant.ma_bibliotheque_distante.ma_table_distante) SELECT zone_1, zone_2 FROM ma_table_CTE;

C’est le WITH qui définit la CTE à partir du SELECT sur la table distante, le dernier SELECT requêtant la CTE alors que le premier SELECT sert à l’initialiser.

De la même façon, il est également possible de créer et d’alimenter une table à partir d’une table d’un système distant :

CREATE TABLE ma_bibliotheque_locale.ma_table_locale AS(
    WITH ma_table_CTE (zone1, zone2) AS 
        ( SELECT zone1, zone 2 FROM mon_systeme_distant.ma_bibliotheque_distante.ma_table_distante) 
    SELECT zone1, zone2 FROM ma_table_CTE
WITH DATA;

 

Pour requêter 2 tables présentes sur 2 systèmes différents il faut utiliser une table temporaire plutôt qu’une CTE comme cela est expliqué ici.