fr en

Lister tous les chemins d'accès aux données d'une table ou d'un fichier avec QSYS.QADBFDEP et QSYS.QADBKFLD

Objectifs :

Pour récupérer la liste des logiques ou index rattachés à une table ou à un fichier physique, il est possible d’utiliser la commande DSPDBR.
On peut, ensuite, utiliser la commande DSPFD pour récupérer le chemin d’accè de chaque logique ou index retourné…
Mais cela peut très vite devenir assez fastidieux.

Pour palier à cela, il existe des tables SQL très simples à utiliser :

  • QSYS.QADBFDEP pour récupérer la liste des logiques ou index rattachés à une table ou à unfichier physique.
  • QSYS.QADBKFLD pour récupérer le chemin d’accès d’un logique ou d’un index donné.

En combinant les deux dans une même requête, il est alors possible d’obtenir facilement la liste des chemins d’accès aux données d’une table ou d’un fichier…

QSYS.QADBFDEP

QSYS.QADBFDEP permet de lister les différents logiques ou index rattachés à une table ou fichier physique donné.

Exemple de requête sur QSYS.QADBFDEP pour récupérer la liste des logiques et index liés à ma_bibliothèque/mon_fichier :

SELECT 
  DBFLIB   AS PF_LIBRARY, 
  DBFFIL   AS PF_NAME, 
  DBFLDP AS LF_INDEX_LIBRARY, 
  DBFFDP AS LF_INDEX_NAME, 
  DBFTDP AS LF_INDEX_TYPE, 
  DBFRDP AS LF_INDEX_FORMAT 
FROM QSYS.QADBFDEP
WHERE DBFLIB = ma_bibliothèque
AND DBFFIL = mon_fichier
ORDER BY DBFFDP, DBFLDP;

QSYS.QADBKFLD

QSYS.QADBKFLD permet de lister les champs composant les chemin d’accès aux données d’un index ou d’un logique donné.

Exemple de requête sur QSYS.QADBKFLD pour récupérer la liste des clefs d’un logique ou d’un index ma_bibliothèque/mon_index_ou_logique :

SELECT 
    DBKLIB AS PATH_LIBRARY,
    DBKFIL AS PATH_FILE,
    DBKPOS AS ORDINAL_POSITION,
    DBKFLD AS COLUMN_NAME,
    CASE DBKORD
        WHEN ‘A’ THEN ‘ASC’
        WHEN ‘D’ THEN ‘DESC’
    END AS TRI
FROM QSYS.QADBKFLD
WHERE DBKLIB = ‘ma_bibliothèque
  AND DBKFIL = ‘mon_index_ou_logique
ORDER BY DBKLIB, DBKFIL, DBKPOS;

QSYS.QADBFDEP et QSYS.QADBKFLD

Avec QSYS.QADBFDEP et QSYS.QADBKFLD il est donc possible de récupérer tous les chemins d’accés aux données d’une table ou d’un fichier physique en une seule et même requête.

Dans l’exemple suivant les champs composants chaque chemin d’accès  sont regroupés dans une seule et même zone résultat grâce à la fonction LSTAGG.

SELECT A.DBFLIB  AS FILE_LIBRARY, 
             A.DBFFIL   AS FILE, 
             A.DBFLDP AS INDEX_LIBRARY, 
             A.DBFFDP AS INDEX, 
             A.DBFTDP AS INDEX_TYPE, 
             A.DBFRDP AS INDEX_FORMAT,
LISTAGG( DBKPOS 
                 CONCAT ‘-‘ 
                 CONCAT TRIM(DBKFLD) 
                 CONCAT ‘-‘ 
                 CONCAT CASE DBKORD WHEN ‘A’ THEN ‘ASC’ 
                                                         WHEN ‘D’ THEN ‘DESC’ END‘ / ‘ 
             WITHIN GROUP(ORDER BY DBKPOS) AS KEYS_LIST
FROM QSYS.QADBFDEP A
LEFT JOIN QSYS.QADBKFLD B
            ON B.DBKLIB  = A.DBFLDP
          AND B.DBKFIL  = A.DBFFDP
WHERE A.DBFLIB = ‘ma_bibliothèque
     AND A.DBFFIL = mon_fichier
GROUP BY A.DBFLIB, A.DBFFIL, A.DBFLDP, A.DBFFDP, A.DBFTDP, A.DBFRDP  
ORDER BY A.DBFFDP, A.DBFLDP;

 

Exemple

La table ma_bibliotheque/ma_table est liée aux index suivants :

  • ma_bibliotheque/mon_index_1 avec le chemin d’accès
    • Key_1 ascending
    • Key_2_ascending
  • ma_bibliotheque/mon_index_2
    • Key_1 ascending
    • Key_3 descending
  • ma_bibliotheque/mon_index_3
    • Key_3 descending
    • Key_2 ascending

SELECT A.DBFLIB  AS FILE_LIBRARY, 
             A.DBFFIL   AS FILE, 
             A.DBFLDP AS INDEX_LIBRARY, 
             A.DBFFDP AS INDEX,
LISTAGG( DBKPOS 
                 CONCAT ‘-‘ 
                 CONCAT TRIM(DBKFLD) 
                 CONCAT ‘-‘ 
                 CONCAT CASE DBKORD WHEN ‘A’ THEN ‘ASC’ 
                                                         WHEN ‘D’ THEN ‘DESC’ END‘ / ‘ 
             WITHIN GROUP(ORDER BY DBKPOS) AS KEYS_LIST
FROM QSYS.QADBFDEP A
LEFT JOIN QSYS.QADBKFLD B
            ON B.DBKLIB  = A.DBFLDP
          AND B.DBKFIL  = A.DBFFDP
WHERE A.DBFLIB = ‘ma_bibliothèque
     AND A.DBFFIL = ma_table
GROUP BY A.DBFLIB, A.DBFFIL, A.DBFLDP, A.DBFFDP, A.DBFTDP, A.DBFRDP  
ORDER BY A.DBFFDP, A.DBFLDP;

Résultats :