Bouts de codes de Landry SAÏZONOU - Webmaster

Utilisation d'un Curseur en SQL

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 claire ;-)

  • 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".

  1. DECLARE @CPT_ID as int --variable qui récupérera les CPT_ID
  2. DECLARE MyCursor CURSOR --mon curseur
  3. -- Pour tous les CPT_ID de UTILISATEUR qui ont un ETAT=FATIGUE
  4. FOR SELECT ID_USER from UTILISATEURS
        WHERE ETAT='FATIGUE'
  5.     OPEN MyCursor -- j'initialise mon curseur
  6. -- je le rempli avec mon 1er CP_ID retourné par la requête
  7. FETCH MyCursor INTO @CPT_ID
  8.  
  9. -- Tant que je n'ai pas traité tous les CPT_ID de le requête
  10. WHILE @@fetch_Status = 0
  11. BEGIN
  12.     print @CPT_ID + ' - '
  13.     INSERT GROUPES (CPT_ID,NOM_GROUP)
        VALUES(@CPT_ID, 'BESOIN_VACANCES')
  14.  
  15. -- je le rempli avec le CP_ID suivant retourné par la requête
  16.     FETCH MyCursor INTO @CPT_ID
  17. END
  18.  
  19. CLOSE myCursor -- je ferme mon curseur
  20. DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur
  21. 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

 


Valid XHTML 1.0 Transitional Valid CSS!