En SQL embarquée la gestion des erreurs est différente par rapport à un RPGLE classique.
Essentiellement sur 2 points
1) Ca ne plante pas
Vous pouvez donc avoir des erreurs silencieuses
Il est très important de traiter les SQLCODE
Même si vous pensez ne pas en avoir besoin
Les 3 lignes suivantes peuvent être ajoutées sans risque !
EXEC SQL ... ;
IF SQLCODE <> 0;
DSPLY ('nompgm' + ' : ' + %CHAR(SQLCODE) ;
ENDIF;
Permettra d’avoir un message dans la log qui peut vous aider en cas de probléme.
2) On n’a le résultat de la dernière instruction dans le SQLCODE.
Le risque est donc sur une boucle, il est possible que le SQLCODE soit parasité par une autre requête SQL dans une autre fonction par exemple
dou sqlcode <> 0 ;
exec sql ... ;
if sqlcode <> 0 ;
leave ;
endif ;
enddo ;
Pour éliminer ce probléme vous devez sauvegarder votre SQLCODE dans une variable de travail
Votre boucle deviendra
// Déclaration de la variable de travail !
DCL-S W_SQLCODE like SQLCODE;
//
dou w_sqlcode <> 0 ;
exec sql ... ;
if sqlcode <> 0 ;
leave ;
endif ;
W_SQLCODE = SQLCODE ;
enddo
Ainsi vous êtes sur de tester le bon SQLCODE
Remarque :
Pour ceux qui utilisent le sqlstate, la remarque est la même.
Vous pouvez être plus précis que <> 0 ;
Rappel :
en dessus de 0 c’est des avertissements
en dessous c’est des erreurs
par exemple if sqlcode < 0 ; traitera les erreurs uniquement