CODE RETOUR -222

AN UPDATE OR DELETE OPERATION WAS ATTEMPTED AGAINST A HOLE USING CURSOR cursor-name

Explication :
Db2 n’a pas pu traiter une mise à jour ou une suppression positionnée avec le curseur cursor-name défini comme SENSITIVE STATIC. Le programme d’application a tenté d’exécuter une instruction UPDATE ou DELETE WHERE CURRENT OF au moment où le curseur spécifié était positionné sur une ligne de la table d’objets qui est un hole. Chaque ligne sur laquelle se positionne le curseur, à mettre à jour ou à supprimer ne doit pas être un hole :

  • Un update hole se produit lorsque la ligne correspondante de la table sous-jacente a été mise à jour et que la ligne mise à jour ne satisfait plus la condition de recherche spécifiée dans l’instruction SELECT du curseur.
  • Un delete hole se produit lorsque la ligne correspondante de la table sous-jacente a été supprimée.

Cette erreur peut être émise si les situations suivantes se produisent :

  • Si le curseur n’est pas un curseur d’ensemble de lignes, la ligne correspondant à la position actuelle du curseur est soit un trou de mise à jour, soit un trou de suppression. Db2 détecte ces trous lorsque Db2 essaie de mettre à jour ou de supprimer la ligne actuelle de la table de résultats pour le curseur cursor-name et ne peut pas localiser la ligne correspondante de la table sous-jacente.
  • Si le curseur est un curseur d’ensemble de lignes, une ligne correspondant à une ligne de la position actuelle du curseur d’ensemble de lignes est soit un trou de mise à jour, soit un trou de suppression. Db2 détecte ces trous lorsque Db2 essaie de mettre à jour ou de supprimer la ligne actuelle de la table de résultats pour le curseur cursor-name et ne peut pas localiser la ou les lignes correspondantes de la table sous-jacente.


Action du système :
L’instruction ne peut pas être traitée. Aucune donnée n’a été mise à jour ou supprimée et la position du curseur est inchangée.

Réponse du programmeur :
Corrigez la logique du programme d’application pour vous assurer que le curseur est correctement positionné sur la ou les lignes souhaitées de la table d’objets, et que les lignes souhaitées ne sont pas des holes, avant l’exécution de l’instruction DELETE ou UPDATE.

  • Si le curseur n’est pas un curseur d’ensemble de lignes, émettez une instruction FETCH pour positionner le curseur sur une ligne qui n’est pas un trou. Ensuite, relancez l’instruction UPDATE ou DELETE.
  • Si le curseur est un curseur d’ensemble de lignes et qu’il s’agit également de l’instruction UPDATE ou DELETE positionnée destinée à affecter une seule ligne correspondant aux lignes de la position actuelle du curseur d’ensemble de lignes (cela signifie qu’une clause FOR ROW n de ROWSET a été spécifiée), alors modifiez l’instruction UPDATE ou DELETE pour traiter les lignes qui ne sont pas des trous, une par une.
  • Si le curseur est un curseur d’ensemble de lignes et qu’il s’agit également de l’instruction UPDATE ou DELETE positionnée destinée à affecter toutes les lignes correspondant aux lignes de la position actuelle du curseur d’ensemble de lignes (cela signifie qu’une clause FOR ROW n de ROWSET n’a pas été spécifiée), alors modifiez l’instruction UPDATE ou DELETE pour traiter les lignes qui ne sont pas des trous, une par une. Ajoutez une clause FOR ROW n de ROWSET à l’instruction UPDATE ou DELETE pour indiquer quelle ligne du curseur doit être mise à jour ou supprimée.

ETATSQL :
24510