CodeS-SourceS
Rechercher un code, un tuto, une réponse

Utilisation d'un curseur en sql

Avril 2017

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_USERNOMPWETAT
1DUBULLOSxdf5DePFATIGUE
2PARABELLUMFgP45T8EN FORME
3PERTEFRAKAFR8e741FATIGUE


Table GROUPES
ID_USERNOM_GROUP
1ADMIN
1CHEF
2CONSEILLER
2CHEF
3POMPIER


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_USERNOM_GROUP
1ADMIN
1CHEF
2CONSEILLER
2CHEF
3POMPIER
1BESOIN_VACANCES
3BESOIN_VACANCES

A voir également

Publié par cs_saizonou.
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.
[ms sql server] - débuter avec les triggers