fr en

Requêter des tables présentes sur 2 systèmes différents

Objectifs :

Sur l’IBMi, SQL permet de requêter des tables d’un système distant en précisant le nom du système devant le bibliothèque de la table à interroger :

SELECTFROM nom_systeme_distant.nom_bibliotheque.nom_table;

Mais si l’on souhaite faire une jointure de la table distante avec une table locale, ou ajouter une sélection faisant intervenir 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.

Pour contourner le SQLCODE -512 il faut utiliser une table temporaire à partir des données de la table distante.

La table temporaire étant une table locale qui contient les données distantes, la requête ne fait maintenant références qu’à des tables locales.

Principe :

  • Supprimer la table temporaire au cas où elle ait été créée précédemment.
  • Créer la table temporaire avec les données de la table distante
  • Requêter la table temporaire (contenant les données distantes) et la table locale.
  • Supprimer la table temporaire.

Exemple :

Voici un exemple se basant sur :

  • Un système distant appelé : systeme_distant
  • Une bibliothèque distante appelée : bibliotheque_distante
  • Une table sur le système distant appelée : table_distante
  • Un système local appelé : systeme_locale
  • Une bibliothèque locale appelée : bibliotheque_locale
  • Une table locale appelée : table_locale
  • Une table temporaire locale appelée : table_temporaire

— Suppression de la table temporaire
DROP TABLE QTEMP.table_temporaire;

— Création de la table temporaire dans QTEMP
— à partir de la table distante
CREATE TABLE QTEMP.table_temporaire 
AS (SELECT * FROM systeme_distant.bibliotheque_distante.table_distante)
WITH DATA;

— Requete sur la table locale et la table temporaire (image de la table distante)
SELECT * FROM
QTEMP.table_temporaire A
LEFT JOIN bibliotheque_locale.table_locale B
ON B.clef_table_locale = A.clef_table_distante;

— Suppression de la table temporaire
DROP TABLE QTEMP.table_temporaire;

Remarques :

  • Attention aux volumétries, si la table distante contient beaucoup de données, la création de la table temporaire risque de prendre du temps.
    Privilégier une extraction limitées aux champs nécessaires (dans l’exemple je fais un SELECT * mais il est préférable de sélectionner uniquement les champs qui vous seront utiles).
  • Si les données distantes servent uniquement à alimenter une table locale, il est préférable d’utiliser une GTT.
    Comme indiqué ici