Je veux utiliser un curseur de base de données; Il me faut d’abord comprendre son utilisation et sa syntaxe, et dans quel scénario l’utiliser dans des procédures stockées? Existe-t-il différentes syntaxes pour différentes versions de SQL Server?
Quand est-il nécessaire d'utiliser?
Les curseurs sont un mécanisme permettant d'énumérer explicitement les lignes d'un ensemble de résultats, plutôt que de les récupérer en tant que tels.
Toutefois, s’ils peuvent être plus faciles à utiliser pour les programmeurs habitués à écrire While Not RS.EOF Do ...
, ils doivent généralement être évités autant que possible dans les procédures stockées de SQL Server - si vous pouvez écrire une requête sans utiliser de curseur, vous l'optimiseur a beaucoup plus de chances de trouver un moyen rapide de le mettre en œuvre.
En toute honnêteté, je n’ai jamais trouvé de scénario réaliste pour un curseur qui ne pouvait être évité, à l’exception de quelques tâches administratives telles que la boucle sur tous les index du catalogue et leur reconstruction. J'imagine qu'ils peuvent utiliser la génération de rapports ou la fusion de courrier, mais il est probablement plus efficace de faire un travail similaire à celui du curseur dans une application qui communique avec la base de données, laissant ainsi au moteur de base de données ce qu'il fait le mieux: manipuler les ensembles.
les curseurs sont utilisés car dans la sous-requête, nous pouvons récupérer les enregistrements ligne par ligne donc nous utilisons le curseur pour chercher des enregistrements
Exemple de curseur:
DECLARE @eName varchar(50), @job varchar(50)
DECLARE MynewCursor CURSOR -- Declare cursor name
FOR
Select eName, job FROM emp where deptno =10
OPEN MynewCursor -- open the cursor
FETCH NEXT FROM MynewCursor
INTO @eName, @job
PRINT @eName + ' ' + @job -- print the name
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MynewCursor
INTO @ename, @job
PRINT @eName +' ' + @job -- print the name
END
CLOSE MynewCursor
DEALLOCATE MynewCursor
SORTIE:
ROHIT PRG
jayesh PRG
Rocky prg
Rocky prg
Le curseur peut être utilisé pour récupérer des données ligne par ligne base.il agit comme une instruction de bouclage (c'est-à-dire une boucle ou pour une boucle) . Pour utiliser des curseurs dans des procédures SQL, vous devez procéder comme suit: qui définit un jeu de résultats . 2.Ouvrez le curseur pour établir le jeu de résultats . 3.Faites les données en variables locales selon vos besoins à partir du curseur, une ligne à la fois . 4.Fermez le curseur lorsque vous avez terminé.
pour ex:
declare @tab table
(
Game varchar(15),
Rollno varchar(15)
)
insert into @tab values('Cricket','R11')
insert into @tab values('VollyBall','R12')
declare @game varchar(20)
declare @Rollno varchar(20)
declare cur2 cursor for select game,rollno from @tab
open cur2
fetch next from cur2 into @game,@rollno
WHILE @@FETCH_STATUS = 0
begin
print @game
print @rollno
FETCH NEXT FROM cur2 into @game,@rollno
end
close cur2
deallocate cur2
Le curseur lui-même est un itérateur (comme WHILE). Par itérateur, je veux dire un moyen de parcourir le jeu d’enregistrements (c’est-à-dire un ensemble de lignes de données sélectionnées) et d’effectuer des opérations dessus. Les opérations peuvent être INSERT ou DELETE par exemple. Par conséquent, vous pouvez l'utiliser pour la récupération de données par exemple. Cursor fonctionne séquentiellement avec les lignes du jeu de résultats - ligne par ligne. Un curseur peut être considéré comme un pointeur sur une ligne dans un ensemble de lignes et ne peut référencer qu'une ligne à la fois, mais peut être déplacé vers d'autres lignes du jeu de résultats selon les besoins.
Ce link can a une explication claire de sa syntaxe et contient des informations supplémentaires ainsi que des exemples.
Les curseurs peuvent également être utilisés dans Sprocs. C’est un raccourci qui vous permet d’utiliser une requête pour effectuer une tâche au lieu de plusieurs requêtes. Cependant, les curseurs reconnaissent la portée et sont considérés comme non définis en dehors de la portée du sproc et leurs opérations s'exécutent au sein d'une procédure unique. Une procédure stockée ne peut pas ouvrir, extraire ou fermer un curseur qui n'a pas été déclaré dans la procédure.
Je dirais que vous souhaiterez peut-être utiliser un curseur pour comparer des caractéristiques situées sur différentes lignes du jeu de retour ou pour écrire un format de ligne de sortie différent de celui standard, dans certains cas. Deux exemples me viennent à l’esprit:
L'un d'entre eux était dans un collège où chaque classe d'une classe à l'autre avait sa propre rangée dans le tableau. C'était peut-être une mauvaise conception, mais vous deviez comparer plusieurs lignes pour savoir combien de lignes ajouter et supprimer pour déterminer si la personne faisait partie de la classe. Je ne peux pas penser à un moyen simple de faire cela avec seulement SQL.
Un autre exemple consiste à écrire une ligne de total de journal pour GL. Vous obtenez un nombre arbitraire de débits et de crédits dans votre journal, vous avez plusieurs journaux dans votre déclaration d'ensemble de lignes et vous souhaitez écrire une ligne de total de journal chaque fois que vous terminez un journal pour l'enregistrer dans un grand livre. Avec un curseur, vous pouvez savoir quand vous avez quitté un journal et en commencé un autre, disposer d'accumulateurs pour vos débits et crédits et écrire une ligne de total du journal (ou insertion de table) différente de la ligne de débit/crédit.