Utilisation d'un curseur en sql

Tout est dans le titre, ce tutoriel utilise pour exemple l'insertion de données dans une table en fonction du résultat d'une requête basée sur sur une table liée

Pour notre exemple prenons une base de données simplifiée contenant 2 tables.
La première : UTILISATEURS (ID_USER, NOM, PW, ETAT) gère les utilisateurs.La seconde GROUPES (ID_USER, NOM_GROUP) gère les groupes assignés aux utilisateurs.

Contenu des tables

Table UTILISATEURS
ID_USER NOM PW ETAT
1 DUBULLOS xdf5DeP FATIGUE
2 PARABELLUM FgP45T8 EN FORME
3 PERTEFRAKA FR8e741 FATIGUE
Table GROUPES
ID_USER NOM_GROUP
1 ADMIN
1 CHEF
2 CONSEILLER
2 CHEF
3 POMPIER

En clair ;-)

  • DUBULLOS (ID_USER=1, ETAT=FATIGUE) appartient aux groupes ADMIN et CHEF
  • PARABELLUM (ID_USER=2, ETAT= EN FORME) appartient aux groupes CHEF et CONSEILLER
  • PERTEFRAKA (ID_USER=3, ETAT=FATIGUE) appartient au groupe POMPIER

Je veux que tous utilisateurs dont l’ ETAT est "FATIGUE" appartiennent à un nouveau groupe "BESOIN_VACANCES". Pour ce faire je vais utiliser un CURSEUR qui récupérera tous les ID_USER des utilisateurs (table UTILISATEURS) dont le champ ETAT = "FATIGUE" et pour chacun de ces ID_USER on ajoutera une ligne dans la table GROUPES avec pour NOM_GROUP la valeur "BESOIN_VACANCES".

DECLARE @CPT_ID as int--variable qui récupérera les CPT_ID DECLARE MyCursor CURSOR --mon curseur

 -- Pour tous les CPT_ID de UTILISATEUR qui ont un ETAT= FATIGUE

FOR SELECT ID_USER from UTILISATEURS
       WHERE ETAT='FATIGUE'
       OPEN MyCursor -- j'initialise mon curseur

 -- je le rempli avec mon 1er CP_ID retourné par la requête 

FETCH MyCursor INTO @CPT_ID


-- Tant que je n'ai pas traité tous les CPT_ID de le requête 

WHILE @@fetch_Status = 0
BEGIN
      print @CPT_ID + ' - '
      INSERT GROUPES (CPT_ID,NOM_GROUP)
      VALUES(@CPT_ID, 'BESOIN_VACANCES')

-- je le rempli avec le CP_ID suivant retourné par la requête
      FETCH MyCursor INTO @CPT_ID 
END

CLOSE myCursor -- je ferme mon curseur 

DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur 
Print '----------------- Terminé ------------------------'

Voici le nouveau contenu de la table GROUPES

Table GROUPES
ID_USER NOM_GROUP
1 ADMIN
1 CHEF
2 CONSEILLER
2 CHEF
3 POMPIER
1 BESOIN_VACANCES
3 BESOIN_VACANCES
A voir également
Ce document intitulé « Utilisation d'un curseur en sql » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous