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 :
| ID_USER | NOM | PW | ETAT |
|---|---|---|---|
| 1 | DUBULLOS | xdf5DeP | FATIGUE |
| 2 | PARABELLUM | FgP45T8 | EN FORME |
| 3 | PERTEFRAKA | FR8e741 | FATIGUE |
| ID_USER | NOM_GROUP |
|---|---|
| 1 | ADMIN |
| 1 | CHEF |
| 2 | CONSEILLER |
| 2 | CHEF |
| 3 | POMPIER |
En claire ;-)
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_IDDECLARE MyCursor CURSOR --mon curseur- -- Pour tous les CPT_ID de UTILISATEUR qui ont un ETAT=FATIGUE
FORSELECT 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êteFETCH MyCursor INTO @CPT_ID-- Tant que je n'ai pas traité tous les CPT_ID de le requêteWHILE @@fetch_Status = 0BEGINprint @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êteFETCH MyCursor INTO @CPT_IDENDCLOSE myCursor -- je ferme mon curseurDEALLOCATE myCursor -- je libère la mémoire allouée à ce curseurPrint '----------------- Terminé ------------------------'
Voici le nouveau contenu de la table GROUPES
| ID_USER | NOM_GROUP |
|---|---|
| 1 | ADMIN |
| 1 | CHEF |
| 2 | CONSEILLER |
| 2 | CHEF |
| 3 | POMPIER |
| 1 | BESOIN_VACANCES |
| 3 | BESOIN_VACANCES |