fr en

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