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 : 17 713 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 (7)
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é ------------------------'

signaler à un administrateur
Commentaire de ryadus le 21/10/2008 13:19:45

Salut,
Que donnerias le meme programme en PL/SQL svp?

Merci

signaler à un administrateur
Commentaire de saizonou le 21/10/2008 13:58:05

Désolé je ne connais pas les bases oracles

signaler à un administrateur
Commentaire de SharpMao le 17/02/2009 09:19:11

Clair et concis,

on a souvent besoin d'un exemple comme ça,

Merci

signaler à un administrateur
Commentaire de larkanj le 26/06/2009 10:43:14

Clair et concis ... l'idéal

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,094 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.