Page 1 sur 1

Comment remplacer le WHENEVER SQLERROR ?

Posté : mer. 01 juil. 2015, 10:31:47
par germor
Bonjour,
Sous V7R1,
La conversion du "Tag" RPG en Free pose question.

Code : Tout sélectionner

 /FREE
 EXEC SQL
 WHENEVER SQLERROR GOTO ERRSQL;
...
 /END-FREE
C     ErrSQL        Tag
 /FREE
 //* action lors de l'erreur sql
  cancel('Erreur SQL : ' + SQLSTT);     

Existe t'il une astuce pour contourner le fait que Tag n'a aucun remplaçant dans RPG Free ?

Plus globalement, le "WHENEVER SQLERROR" ne doit il pas être abandonné au profit d'une gestion d'erreurs SQL après chaque instruction SQL ?

Merci d'avance pour vos réponses.

Posté : mer. 01 juil. 2015, 12:00:54
par germor
Réponse à moi-même :

Je suis chaque fois toujours plus étonné (c'est mon coté fleur bleue ;-) ) de constater que c'est en énonçant puis en écrivant ma question sur le forum, que je trouve la réponse (Cela arrive environ 7 fois sur 10).

Ici, j'opte pour l'abandon de "WHENEVER SQLERROR" au profit d'un bon :

Code : Tout sélectionner

       if SQLCODE <> 0 and SQLCODE <> 100;
          cancel&#40;'SQLCODE= ' + %Char&#40;SQLCODE&#41; + ' SQLSTT= ' + SQLSTT&#41;; 
       endif;   
après chaque ordre SQL.

GOTO

Posté : mer. 01 juil. 2015, 12:37:12
par cmasse
Le problème avec le WHENEVER c'est le GOTO (qui me semble une mauvaise pratique)

la solution proposée me semble être la bonne, on peut aussi utiliser GET DIAGNOSTICS

Code : Tout sélectionner

   exec,sql
    GET DIAGNOSTICS CONDITION 1
               message = MESSAGE_TEXT
   exec sql
    GET DIAGNOSTICS CONDITION 1
               etat = DB2_RETURNED_SQLSTATE | DB2_RETURNED_SQLCODE


   exec sql
    CALL procedure;
   exec sql
    GET DIAGNOSTICS valretour = RETURN_STATUS;


   exec sql
        DELETE From fichier Where ...;
   exec sql
    GET DIAGNOSTICS nbrdelignes = ROW_COUNT;