Getsuyodev, Programming is mainly used when constructing an application. Programming requires knowledge of application domains, algorithms, and programming language expertise. Programming can be developed in different logic based on developer knowledge.

SGBD – Les curseurs

Système de gestion de base de données



Introduction:

Ce support a pour but de vous initier à la manipulation de données au travers des curseurs.

Les curseurs permettent de parcourir un jeu de données issu d’une requête de sélection et de traiter individuellement chaque ligne.

En règle générale, nous traitons les lignes par lot.

Toutes les lignes du lot font l’objet d’un traitement similaire.

Mais nous avons besoin, parfois, de différencier les opérations à exécuter en fonction de la valeur des colonnes d’une ligne.

Les curseurs sont une extension logique des jeux de résultats qui permettent aux applications de manipuler le jeu de résultats ligne par ligne. Nous retrouverons les mêmes principes mis en œuvre dans le cas de la manipulation de données au travers de composants tiers ADO associés à des fournisseurs de données ODBC ou OLE DB

Nous allons découvrir au cours de ce chapitre les différentes instructions relatives aux curseurs :

  • La déclaration du curseur
  • L’ouverture et la fermeture
  • Le parcours du curseur
  • La destruction du curseur

Déclaration d’un curseur :

Un curseur est une variable d’un type particulier CURSOR. Il se déclare donc à l’aide du mot clé DECLARE.

Portée

Il est possible de définir la portée du curseur.

Par défaut, la portée est locale à la procédure stockée ou au lot d’instructions dans lequel celui-ci est utilisé.

Mais la durée de vie d’un curseur peut être étendue à la durée de la connexion SQL qui l’a créée. Dans ce cas, il sera considéré comme de portée globale. Les mots-clés LOCAL, GLOBAL permettent de définir la portée du curseur.

Dans le cas d’un curseur de portée globale, la mémoire occupée par ce curseur sera libérée implicitement lors de la fermeture de la connexion SQL.

Défilement

Mots clés FORWARD_ONLY et SCROLL

Par défaut un curseur est en défilement vers l’avant uniquement. C’est le cas le plus fréquent d’utilisation : on lit le curseur séquentiellement depuis la première ligne jusqu’à la dernière au moyen de l’opération FETCH NEXT.

Mais il est possible d’étendre les fonctionnalités de parcours de ce dernier en complétant la définition du curseur à l’aide du mot clé SCROLL.

Il sera alors possible d’utiliser de multiples opérations de déplacement, de manière relative ou absolue, par le biais des instructions FIRST, LAST, PRIOR, NEXT, RELATIVE et ABSOLUTE.

Type du curseur

Les différents types de curseurs impactent les performances et le reflet des modifications apportées aux lignes présentes dans le curseur.

Par défaut, le curseur est dynamique et reflète donc toutes les modifications apportées en cours de traitement sur les lignes présentes dans le curseur.

STATIC: Définit un curseur qui fait une copie temporaire des données qu’il doit utiliser. Toutes les réponses aux requêtes destinées au curseur sont effectuées à partir de cette table temporaire dans tempdb; par conséquent, les modifications apportées aux tables de base ne sont pas reflétées dans les données renvoyées par les extractions de ce curseur, et ce dernier n’accepte pas de modifications.

KEYSET:

Spécifie que l’appartenance au curseur et l’ordre des lignes sont fixés lors de l’ouverture du curseur.

L’ensemble des clés qui identifient de manière unique les lignes est créé dans une table de tempdb, connue sous le nom de keyset.

Les modifications apportées aux valeurs non-clés dans les tables de la base, que ce soit celles effectuées par le propriétaire du curseur ou celles validées par les autres utilisateurs, sont visibles lorsque le propriétaire parcourt le curseur.

Les insertions effectuées par d’autres utilisateurs ne sont pas visibles  Si vous supprimez une ligne, une tentative d’extraction de la ligne renvoie la valeur -2 pour @@FETCH_STATUS.

Les mises à jour de valeurs clés effectuées hors du curseur sont semblables à la suppression de l’ancienne ligne suivie de l’insertion d’une nouvelle. La ligne comprenant les nouvelles valeurs n’est pas visible et si vous tentez d’extraire la ligne contenant l’ancienne valeur, le système renvoie la valeur -2 pour @@FETCH_STATUS. Les nouvelles valeurs sont visibles si la mise à jour s’effectue via le curseur en spécifiant la clause WHERE CURRENT OF.

DYNAMIC : Définit un curseur qui reflète toutes les modifications de données apportées aux lignes dans son jeu de résultats lorsque vous faites défiler le curseur. Les valeurs de données, l’ordre et l’appartenance aux lignes peuvent changer à chaque extraction.

Verrouillage des lignes

READ_ONLY : Interdit les mises à jour par l’intermédiaire de ce curseur. Le curseur ne peut être référencé dans une clause WHERE CURRENT OF dans une instruction UPDATE ou DELETE. Cette option supplante la fonction implicite de mise à jour d’un curseur.

SCROLL_LOCKS: Spécifie que les mises à jour ou les suppressions positionnées, effectuées par l’intermédiaire du curseur sont sûres de réussir. Les lignes sont verrouillées dès qu’elles sont lues par le curseur, de manière à garantir leur disponibilité pour des modifications ultérieures.

OPTIMISTIC: Spécifie que les mises à jour ou les suppressions positionnées, effectuées par l’intermédiaire du curseur, échouent si la ligne a été mise à jour depuis qu’elle a été lue par le curseur. SQL Server ne verrouille pas les lignes quand elles sont lues par le curseur. Au contraire, il compare les valeurs de la colonne TIMESTAMP, ou une valeur de CHECKSUM si la table ne comprend pas de colonne TIMESTAMP, afin de déterminer si la ligne a été modifiée après avoir été lue par le curseur. Si la ligne a été modifiée, la mise à jour ou la suppression positionnée que vous avez tentée échoue.

Génération du jeu de résultats

Le jeu de résultats est généré à partir de l’instruction SELECT spécifiée lors de la définition du curseur.

Opérations de mise à jour

Il est possible de préciser à ce niveau quelles sont les colonnes qui pourront faire l’objet d’une mise à jour.

UPDATE [OF Colonne1 [,…Colonnen]]

Définit les colonnes qui peuvent être mises à jour par le curseur.

Si vous indiquez UPDATE sans préciser de liste de colonnes, toutes les colonnes peuvent être mises à jour.

Si vous spécifiez OF Colonne1 [,…Colonne], seules les colonnes énumérées dans la liste peuvent être modifiées.

Ouverture et lecture :

L’instruction OPEN déclenche l’exécution de la requête SELECT sous jacente et charge le jeu de résultats.

Lecture

L’instruction FETCH charge les valeurs de la ligne dans la liste de variables précisée en complément au niveau du mot clé INTO.

L’instruction FECTCH peut être utilisée avec les arguments suivants : NEXT, PRIOR, FIRST, LAST, ABSOLUTE, RELATIVE

NEXT

Renvoie la ligne de résultats immédiatement après la ligne courante, et incrémente cette dernière de la ligne renvoyée.

Si FETCH NEXT est la première extraction effectuée sur un curseur, cette instruction renvoie la première ligne dans le jeu de résultats.

NEXT est l’option d’extraction du curseur par défaut.

PRIOR

Renvoie la ligne de résultats immédiatement avant la ligne courante, et décrémente cette dernière en fonction de la ligne renvoyée.

Si FETCH PRIOR est la première extraction effectuée sur un curseur, aucune ligne n’est renvoyée et le curseur reste placé avant la première ligne.

FIRST

Renvoie la première ligne dans le curseur et la transforme en ligne courante.

LAST

Renvoie la dernière ligne dans le curseur et la transforme en ligne courante.

ABSOLUTE {n | @nvar}

Si n ou @nvar est un nombre positif, cela renvoie l’énième ligne depuis le début du curseur et transforme la ligne renvoyée en nouvelle ligne courante. Si n ou @nvar est un nombre négatif, cela renvoie l’énième ligne avant la fin du curseur et transforme la ligne renvoyée en nouvelle ligne courante. Si n ou @nvar est égal à 0, aucune ligne n’est renvoyée. n doit correspondre à une valeur constante de type entier et @nvar doit être de type smallint, tinyint ou int.

RELATIVE {n | @nvar}

Si n ou @nvar est un nombre positif, cela renvoie l’énième ligne à partir de la ligne courante et transforme la ligne renvoyée en nouvelle ligne courante. Si n ou @nvar est un nombre négatif, il renvoie l’énième ligne avant la ligne courante et transforme la ligne renvoyée en nouvelle ligne courante. Si n ou @nvar est égal à 0, la ligne courante est renvoyée.

INTO

Permet de préciser la liste des variables recevant la valeur des colonnes.

Cette liste doit respecter l’ordre des colonnes de l’ordre SELECT à l’origine du jeu de résultats.

@@FETCH_STATUS

Renvoie l’état de la dernière instruction FETCH effectuée sur un curseur actuellement ouvert par la connexion.

Valeurs renvoyées par l’instruction FETCH

0  : L’instruction FETCH a réussi.

-1 : L’instruction FETCH a échoué ou la ligne se situait au-delà du jeu de résultats.

-2 : La ligne recherchée est manquante.

Fermeture et libération de mémoire :

Exemple : Déclaration

Parcours du curseurs

Fermeture et libération de mémoire

Processus des curseurs en bref :

Pour utiliser un curseur, vous devez mettre en œuvre le processus suivant :

  • Associez un curseur au jeu de résultats d’une instruction SELECT et définissez les caractéristiques du curseur, en indiquant par exemple, si les lignes contenues dans le curseur peuvent être mises à jour.
  • Exécutez l’instruction OPEN pour remplir le curseur.
  • Dans le curseur que vous voulez parcourir, extrayez les lignes au moyen de la commande FETCH. L’opération consistant à récupérer une ligne ou un bloc de lignes à partir d’un curseur est appelée une extraction. Le défilement est l’opération consistant à effectuer une série d’extractions afin d’extraire des lignes vers l’avant ou vers l’arrière.
  • Vous pouvez éventuellement effectuer des opérations de modification sur la ligne à la position actuelle du curseur.
  • Fermez le curseur à l’aide de l’instruction CLOSE.
  • Libérez la mémoire allouée au curseur avec DEALLOCATE.

Comments are closed, but trackbacks and pingbacks are open.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More