begin process at 2010 03 18 16:05:53
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Procédure

 > UTILISATION D'UN CURSEUR EN SQL

UTILISATION D'UN CURSEUR EN SQL


 Information sur le tutoriel

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

 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

Commentaires

Commentaire de saizonou le 18/05/2006 15:46:36

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

Commentaire de adc08 le 19/02/2007 12:05:53

simple clair concis
bref du bonheur

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é ------------------------'

Commentaire de ryadus le 21/10/2008 13:19:45

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

Merci

Commentaire de saizonou le 21/10/2008 13:58:05

Désolé je ne connais pas les bases oracles

Commentaire de SharpMao le 17/02/2009 09:19:11

Clair et concis,

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

Merci

Commentaire de larkanj le 26/06/2009 10:43:14

Clair et concis ... l'idéal

Commentaire de dk5888 le 05/11/2009 14:28:56

Merci pour l'exemple sur le curseur. Par contre pour un cas comme ça, privilégier une simple requête :

INSERT INTO GROUPES
    SELECT ID_USER, 'BESOIN_VACANCES' FROM UTIL
    WHERE ETAT='FATIGUE'

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,125 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales