Utiliser des champs d'audit autogérés dans les tables SQL
Bonne pratique :
SQL permet d’ajouter, aux données métiers des tables SQL, des champs d’audit permettant de recueuillir des informations relatives aux actions réalisées sur les données de ces tables.
Les informations portées par ces champs d’audit peuvent être :
- Le type de la dernière action réalisée sur l’enregistrement (Création/Mise à jour)
- La date et heure de création de l’enregistrement
- La date et heure de modification de l’enregistrement
- Le profil utilisateur ayant créé l’enregistrement
- Le profil utilisateur ayant modifié l’enregistrement
- Le job ayant modifié l’enregistrement
- Le programme ayant modifié l’enregistrement
Syntaxe :
Exemple 1: Tester si au moins un enregistrement est présent dans la table ma_bibliotheque.ma_table
Dcl-s ma_variable_resultat CHAR(1) inz(‘N‘);
EXEC SQL
SELECT ‘O‘
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(
SELECT mon_champ
FROM ma_bibliotheque.ma_table);
// test si au moins 1 enregistrement est présent dans ma_bibliotheque.ma_table
IF ma_variable_resultat = ‘O‘;
// Au moins 1 enregistrement est présent dans la table
endif;
Exemple 2: Tester si au moins un enregistrement est répond aux critères de sélection
Dcl-s ma_variable_resultat CHAR(1) inz(‘N‘);
EXEC SQL
SELECT ‘O‘
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(
SELECT mon_champ
FROM ma_bibliotheque.ma_table
WHERE nom_champ = :ma_variable_rpg);
// test si au moins 1 enregistrement répond à la sélection mon_champ = :ma_variable_rpg dans ma_bibliotheque.ma_table
IF ma_variable_resultat = ‘O‘;
// au moins 1 enregistrement répond à la séléection
endif;
Exemple 3: WHERE EXISTE dans une requête SQL dynamique
Attention : Dans une requête SQL dynamique si aucun résultat n’est retourné, la clause WHERE EXISTS lève une erreur (SQLCODE -305).
Pour palier à cela, il suffit d’encapsuler le WHERE EXISTS dans un CASE.
Exemple : Tester si une bibliothèque ( = variable dynamique) existe
Dcl-s G_EXISTE CHAR(1) inz;
Dcl-s G_REQUETE CHAR(500) inz;
Dcl-s ma_bibliotheque CHAR(10) inz;
// Initialisation de la bibliotèque pour laquelle on souhaite tester l’existence
ma_bibliotheque = ‘maBib’;
G_EXISTE = ‘N’;
G_REQUETE = ‘VALUES(‘
+ ‘CASE(SELECT »O » FROM SYSIBM.SYSDUMMY1 WHERE EXISTS(‘
+ ‘SELECT OBJECT_COUNT FROM TABLE(QSYS2.LIBRARY_INFO( »’
+ %TRIM(ma_bibliotheque)
+ »’)))) WHEN »O » THEN »O » ELSE »N » END) INTO ?’;
EXEC SQL
PREPARE SQLSTM FROM :G_REQUETE;
IF SQLCODE = 0;
EXEC SQL
EXECUTE SQLSTM USING :G_EXISTE;
Endif;
// test si la bibliothèque cherchée existe
If G_EXISTE = ‘O’;
// La bibliothèque cherchée existe
Endif;
Remarque :
Pour savoir si une table existe ou non, il faut directement requêter QSYS2.OBJECT_STATISTICS ou QSYS2.SYSTABLES.
Exemples pour savoir si la table ma_table existe dans la biliothèque ma_bibliotheque :
Dcl-s ma_variable_resultat CHAR(1) inz(‘N‘);
SELECT ‘O’
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(
SELECT SYSTEM_TABLE_NAME
FROM QSYS2.SYSFILES
WHERE SYSTEM_TABLE_SCHEMA = ‘ma_biliotheque’
AND SYSTEM_TABLE_NAME = ‘ma_table’);
// test si la table ma_table existe dans la bibliothèque ma_bibliotheque
IF ma_variable_resultat = ‘O‘;
// La table ma_table existe dans la bibliothéque ma_bibliotheque
endif;
// OU
Dcl-s ma_variable_resultat CHAR(1) inz(‘N‘);
SELECT ‘O’
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(SELECT OBJNAME FROM TABLE(QSYS2.OBJECT_STATISTICS(‘ma_bibliotheque’, ‘*FILE’, ‘ma_table’)));
// test si la table ma_table existe dans la bibliothèque ma_bibliotheque
IF ma_variable_resultat = ‘O‘;
// La table ma_table existe dans la bibliothéque ma_bibliotheque
endif;
Conclusion :
Il faut utiliser :
- SELECT COUNT(*)
Lorsque l’on souhaite connaitre le nombre d’enregistrements présents dans une table ou répondant à une sélection. - WHERE EXISTS
Lorsque que l’on souhaite savoir si une table contient au moins un enregistrement ou si une clause WHERE retourne au moins un enregistrement