GET DIAGNOSTICS
Objectif :
Lorsque l’on fait du SQL EMBEDDED, on peux recupérer des informations relatives à la dernière requête SQL exécutée, en testant les valeurs de SQLCODE, SQLSTATE ou SQLERRD(3).
C’est efficace mais les informations retournées sont un peu succintes et peu explicites.
Pour palier à cela, il est possible de récupérer d’autres informations en lançant une nouvelle requête SQL avec GET DIAGNOSTICS.
GET DIAGNOSTICS retourne de nombreuses informations relatives à l’exécution de la requête précédente telles que :
- ROW_COUNT : nombre de lignes traitées INT(10)
(nombre de lignes retournées, insérées, mises à jour ou supprimées) - CONDITION_NUMBER : nombre de CONDITIONS (messages) retournées INT(10)
- Pour chaque CONDITION
(= pour chaque message SQL retourné par la requête précédente)- DB2_RETURNED_SQLCODE : SQLCODE CHAR(5)
- RETURNED_SQLSTATE : SQLSTATE CHAR(5)
- MESSAGE_ID : Identifiant du texte du message CHAR(10)
- MESSAGE_LENGTH : Longueur du texte du message INT(5)
- MESSAGE_TEXT : texte du message texte VARCHAR(32740)
- MESSAGE_ID1 : Code message arrêt CPF VARCHAR(7)
- MESSAGE_ID2 : Code message diagnostic CPD CHAR(10)
- DB2_LINE_NUMBER : Numéro ligne erreur SQL CHAR(5)
- CONDITION_NUMBER : Nombre de CONDITIONS retournées INT(10)
- SERVER_NAME : Nom du serveur VARCHAR(128)
- SCHEMA_NAME : Nom de la bibliothèque VARCHAR(128)
- TABLE_NAME : Nom du la table VARCHAR(128)
- SPECIFIC_NAME : Nom long de la table VARCHAR(128)
- CURSOR_NAME : Nom du curseur VARCHAR(128)
- …
Pour obtenir la liste complète des données retournées par GET DIAGNOSTICS, il suffit jeter un oeil sur le site IBM.
GET DIAGNOSTICS facilite grandement la mise en place d’un service ILE (programme de services) de log des erreurs SQL.
Exemple d’utilisation :
//——————————————————————————-
// Déclaration de la DS retournée par GET DIAGNOSTICS
//——————————————————————————-
DCL-DS DS_DIAG QUALIFIED;
DB2_RETURNED_SQLCODE CHAR(5);
RETURNED_SQLSTATE CHAR(5);
ROWS_COUNT INT(10);
MESSAGE_ID CHAR(10);
MESSAGE_LENGTH INT(5);
MESSAGE_TEXT VARCHAR(32740);
SERVER_NAME VARCHAR(128);
SCHEMA_NAME VARCHAR(128);
TABLE_NAME VARCHAR(128);
END-DS DS_DIAGNOTIC;
//—————————————————–
// Requête SQL
//—————————————————–
EXEC SQL
SELECT mon_champ INTO :ma_variable
FROM ma_bibliotheque.ma_table;
//—————————————————–
// Requête SQL GET DIAGNOSTICS
//—————————————————–
IF SQLCODE = 0;
EXEC SQL
GET DIAGNOSTICS
:DS_DIAG.ROWS_COUNT = ROW_COUNT;
ELSE;
EXEC SQL
GET DIAGNOSTICS CONDITION 1
:DS_DIAG.DB2_RETURNED_SQLCODE = DB2_RETURNED_SQLCODE,
:DS_DIAG.RETURNED_SQLSTATE = RETURNED_SQLSTATE,
:DS_DIAG.MESSAGE_ID = DB2_MESSAGE_ID,
:DS_DIAG.MESSAGE_LENGTH = MESSAGE_LENGTH,
:DS_DIAG.MESSAGE_TEXT = MESSAGE_TEXT,
:DS_DIAG.SERVER_NAME = SERVER_NAME,
:DS_DIAG.SCHEMA_NAME = SCHEMA_NAME,
:DS_DIAG.TABLE_NAME = TABLE_NAME
ENDIF;
Exemple de résultats :
DS_DIAG.DB2_RETURNED_SQLCODE = ‘-204 ‘
DS_DIAG.RETURNED_SQLSTATE = ‘42704’
DS_DIAG.ROWS_COUNT = 0
DS_DIAG.MESSAGE_ID = ‘SQL0204 ‘
DS_DIAG.MESSAGE_LENGTH = 44
DS_DIAG.MESSAGE_TEXT = ‘ma_table de type *FILE dans ma_bibliothèque non trouvé. ‘
DS_DIAG.SERVER_NAME = ‘mon_serveur‘
DS_DIAG.SCHEMA_NAME = ‘ma_bibliothèque‘
DS_DIAG.TABLE_NAME = ‘ma_table‘