begin process at 2008 05 16 16:56:00
1 173 575 membres
396 nouveaux aujourd'hui
13 971 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

UTILISATION D'UN CURSEUR EN SQL


Information sur le tutorial

Catégorie :Procédure Date de création : 18/05/2006 15:44:14 Vu : 6 219 fois

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

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

Tutorial

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

  • signaler à un administrateur
    Commentaire de saizonou le 18/05/2006 15:46:36

    J'espère que tout cela est assez clair, sinon j'attend vos remarques

  • signaler à un administrateur
    Commentaire de adc08 le 19/02/2007 12:05:53

    simple clair concis
    bref du bonheur

  • signaler à un administrateur
    Commentaire de chihab1 le 23/04/2007 00:18:06

    bonsoir
    une ptite correction du code

    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 UTIL
        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 into GROUPEs 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é ------------------------'

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Boutique

Boutique de goodies CodeS-SourceS