{SQL Server} c'est koi un curseur
Fermé
lolipop18
Messages postés
3
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
11 décembre 2009
-
10 déc. 2009 à 13:01
OlivrT Messages postés 323 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 24 mai 2012 - 11 déc. 2009 à 09:29
OlivrT Messages postés 323 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 24 mai 2012 - 11 déc. 2009 à 09:29
Bonjour,
SVP pouriez vous m'expliquer c quoi un curseur et à quoi sert il?? un exemple ne serait pas de refus merci.
SVP pouriez vous m'expliquer c quoi un curseur et à quoi sert il?? un exemple ne serait pas de refus merci.
A voir également:
- {SQL Server} c'est koi un curseur
- Ps3 media server - Télécharger - Divers Réseau & Wi-Fi
- Filezilla server - Télécharger - Téléchargement & Transfert
- Comment faire apparaître le curseur sans souris - Guide
- Mysql community server - Télécharger - Bases de données
- Serviio media server - Télécharger - TV & Vidéo
6 réponses
OlivrT
Messages postés
323
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
24 mai 2012
36
10 déc. 2009 à 16:39
10 déc. 2009 à 16:39
voici un exemple de script que j'ai fait. Nous avons un call center, et une table client par lettre de alphabet. Chaque table associée à un agent commercial. Le problème c'est de mettre à jour ces tables chaque jour selon un nombre de fichier trouvés dans x répertoires sur le réseau. Le nombre de fichier pouvant varier chaque jour, impossible de créer un pack pour un fichier qui peut-être ne sera pas là ...
Le nombre de variantes étant trop important, j''ai donc créé un cursor pour créer un sql dynamique :
SET @SQL = 'INSERT INTO [MaBase].[dbo].[import_temp]('[NUMPAQ], [NOTPAQ])'
DECLARE cursor_forum CURSOR FOR SELECT [rowdesc] FROM [MaBase].[dbo].[tmpFile]
DECLARE @row VARCHAR(600), @insert VARCHAR(1500)
DECLARE @do INT
SET @do = 1
OPEN cursor_forum
FETCH NEXT FROM cursor_forum INTO @row
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
SET @insert = @sql + ' VALUES (' + @row + ')'
EXEC(@insert)
SET @do = @do + 1
END
FETCH NEXT FROM cursor_forum INTO @row
END
CLOSE cursor_forum
DEALLOCATE cursor_forum
Je ne rentre pas dans les détails mais c'est vraiment quand on ne peut faire autrement qu'il faut utiliser les curseurs. Dans mon cas des fichiers à importer tous les jours ... le nombre pouvant varier ... données temporaires ...
Le nombre de variantes étant trop important, j''ai donc créé un cursor pour créer un sql dynamique :
SET @SQL = 'INSERT INTO [MaBase].[dbo].[import_temp]('[NUMPAQ], [NOTPAQ])'
DECLARE cursor_forum CURSOR FOR SELECT [rowdesc] FROM [MaBase].[dbo].[tmpFile]
DECLARE @row VARCHAR(600), @insert VARCHAR(1500)
DECLARE @do INT
SET @do = 1
OPEN cursor_forum
FETCH NEXT FROM cursor_forum INTO @row
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
SET @insert = @sql + ' VALUES (' + @row + ')'
EXEC(@insert)
SET @do = @do + 1
END
FETCH NEXT FROM cursor_forum INTO @row
END
CLOSE cursor_forum
DEALLOCATE cursor_forum
Je ne rentre pas dans les détails mais c'est vraiment quand on ne peut faire autrement qu'il faut utiliser les curseurs. Dans mon cas des fichiers à importer tous les jours ... le nombre pouvant varier ... données temporaires ...
OlivrT
Messages postés
323
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
24 mai 2012
36
11 déc. 2009 à 09:29
11 déc. 2009 à 09:29
c'est juste du concret, l'exemple de Blux est plus simple mais tout à fait parlant.
Gardez en mémoire que c'est possible, il ne faut surtout pas que cela vous fasse peur.
Bonne journée
Gardez en mémoire que c'est possible, il ne faut surtout pas que cela vous fasse peur.
Bonne journée
blux
Messages postés
26724
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2025
3 332
10 déc. 2009 à 14:16
10 déc. 2009 à 14:16
Salut,
en gros, c'est un pointeur qui va pouvoir te permettre d'accéder de manière individuelle aux résultats d'une requête, un peu comme si tous les résultats étaient mis dans un tableau et que tu puisses le parcourir.
C'est utilisé pour faire des traitements particuliers sur un jeu de résultats et c'est employé essentiellement avec du SQL procédural (type PL/SQL ou SQL dans un programme batch).
Google sera ton ami pour des exemples...
en gros, c'est un pointeur qui va pouvoir te permettre d'accéder de manière individuelle aux résultats d'une requête, un peu comme si tous les résultats étaient mis dans un tableau et que tu puisses le parcourir.
C'est utilisé pour faire des traitements particuliers sur un jeu de résultats et c'est employé essentiellement avec du SQL procédural (type PL/SQL ou SQL dans un programme batch).
Google sera ton ami pour des exemples...
OlivrT
Messages postés
323
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
24 mai 2012
36
10 déc. 2009 à 14:40
10 déc. 2009 à 14:40
J'ajouterai que c'est à éviter car cela demande beaucoup de ressources à un serveur ... mais parfois il est impossible de faire autrement.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lolipop18
Messages postés
3
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
11 décembre 2009
10 déc. 2009 à 16:09
10 déc. 2009 à 16:09
"C'est utilisé pour faire des traitements particuliers sur un jeu de résultats"
quels traitement par exemple (un tri) ???
quels traitement par exemple (un tri) ???
blux
Messages postés
26724
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2025
3 332
10 déc. 2009 à 16:51
10 déc. 2009 à 16:51
quels traitement par exemple (un tri) ???
Non, ça, tu le laisses faire par le moteur SQL avec un GROUP BY...:-)
C'est traiter de manière particulière UNE ligne de résultat (le tri ne s'interesse qu'à la globalité des résultats)
Ex :
Si une ligne contient toto, alors mettre à jour la table titi...
Si une ligne contient tata, alors mettre à jour la table titi et tutu..
Si une ligne contient tutu, alors mettre à jour la table tata et toto...
Tu devrais écrire 3 requêtes SQL pour faire ces 3 traitements, à passer sur toutes les lignes de résultat, donc 3 lancements de la requête initiale pour les mises à jour.
Avec un curseur, tu lances ta requête, et à chaque ligne remontée (fetch du curseur) tu fais ton traitement : les données ne sont lues qu'une fois...
Non, ça, tu le laisses faire par le moteur SQL avec un GROUP BY...:-)
C'est traiter de manière particulière UNE ligne de résultat (le tri ne s'interesse qu'à la globalité des résultats)
Ex :
Si une ligne contient toto, alors mettre à jour la table titi...
Si une ligne contient tata, alors mettre à jour la table titi et tutu..
Si une ligne contient tutu, alors mettre à jour la table tata et toto...
Tu devrais écrire 3 requêtes SQL pour faire ces 3 traitements, à passer sur toutes les lignes de résultat, donc 3 lancements de la requête initiale pour les mises à jour.
Avec un curseur, tu lances ta requête, et à chaque ligne remontée (fetch du curseur) tu fais ton traitement : les données ne sont lues qu'une fois...
blux
Messages postés
26724
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2025
3 332
>
blux
Messages postés
26724
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2025
11 déc. 2009 à 09:27
11 déc. 2009 à 09:27
euh le tri, c'est ORDER BY pas GROUP BY (bien qu'il trie quand même dans ce cas)...
mon clavier a fourché ;-)
mon clavier a fourché ;-)
lolipop18
Messages postés
3
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
11 décembre 2009
11 déc. 2009 à 08:58
11 déc. 2009 à 08:58
merci à tous, après le message d'oliver T, je crois que je ne veux plus savoir c quoi un curseur ;-) lol.c'est plus compliqué que je ne le pensais.