En SQL embarquée la gestion des erreurs est différentes 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é sans risque !
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 resultat de la dernière instruction dans le SQLCODE.
Le risque est donc sur une boucle il est possible que le SQLCODE est été parasité par une autre requête sql
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
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