OVH Cloud OVH Cloud

Demande Explications Curseurs

2 réponses
Avatar
Stephane BOUVET
Bonjour,

Depuis tout petit (enfin depuis 2 ans), lorsque j'utilise des curseurs, j'ai
pris l'habitude de les déclarer en INSENSITIVE :

DECLARE csrXXX INSENSITIVE CURSOR FOR
[...]

Sans comprendre à quoi ça sert ; l'aide de SQL Server me semble plutôt floue
là-dessus. Pour essayer, je n'ai pas mis insensitive et il m'est arrivé ceci
:

DB-Library: Unexpected EOF from SQL Server. General network error. Check
your documentation.
Net-Library error 10054: ConnectionCheckForData (CheckforData()).

DB-Library Process Dead - Connection Broken

Alors j'ai remis insensitive, mais je ne comprends toujours pas...

Quelqu'un pourrait-il m'expliquer les différences entre les curseurs
(insensitive, readonly, etc.)

Merki d'avance
--
~°~ -=S.T.E.I.N.=- ~°~
http://sbrnr.multimania.com

2 réponses

Avatar
David Brabant
"Stephane BOUVET" wrote

DECLARE csrXXX INSENSITIVE CURSOR FOR
Sans comprendre à quoi ça sert ; l'aide de SQL Server
me semble plutôt floue là-dessus.



Lorsque tu parcoures une table avec un curseur, il est
évidemment probable que le contenu de cette même
table soit modifié simultanément par d'autres
utilisateurs/processes durant le temps nécessaire à
effectuer ta boucle.

Lorsque tu déclares ton curseur "insensitive", un
"snapshot" de la table est effectué dans tempdb
et les données sont "fetchées" (ugh!) à partir de
ce snapshot. Tu ne vois donc pas les éventuels
updates effectués sur la table pendant le parcours
de ton result set au travers de ton curseur.

Dans le cas où ton curseur n'est pas "insensitive",
les données sont lues dans la table elle-même (pas
de snapshot) et sont donc "sensibles" aux updates.

--
David
Avatar
Stephane BOUVET
Merki bokou !!
--
~°~ -=S.T.E.I.N.=- ~°~
http://sbrnr.multimania.com
"David Brabant" a écrit dans le
message de news:blhau3$6qm$
"Stephane BOUVET" wrote

> DECLARE csrXXX INSENSITIVE CURSOR FOR
> Sans comprendre à quoi ça sert ; l'aide de SQL Server
> me semble plutôt floue là-dessus.

Lorsque tu parcoures une table avec un curseur, il est
évidemment probable que le contenu de cette même
table soit modifié simultanément par d'autres
utilisateurs/processes durant le temps nécessaire à
effectuer ta boucle.

Lorsque tu déclares ton curseur "insensitive", un
"snapshot" de la table est effectué dans tempdb
et les données sont "fetchées" (ugh!) à partir de
ce snapshot. Tu ne vois donc pas les éventuels
updates effectués sur la table pendant le parcours
de ton result set au travers de ton curseur.

Dans le cas où ton curseur n'est pas "insensitive",
les données sont lues dans la table elle-même (pas
de snapshot) et sont donc "sensibles" aux updates.

--
David