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 :