logo

Qu’est-ce que le curseur en SQL ?

Le curseur est une mémoire temporaire ou un poste de travail temporaire. Il est attribué par Base de données Serveur au moment de l'exécution d'opérations DML (Data Manipulation Language) sur la Table par l'Utilisateur. Les curseurs sont utilisés pour stocker les tables de base de données.

Il existe 2 types de curseurs : les curseurs implicites et les curseurs explicites. Ceux-ci sont expliqués comme suit ci-dessous.



  1. Curseurs implicites : Les curseurs implicites sont également appelés curseurs par défaut de SQL SERVER. Ces curseurs sont alloués par SQL SERVER lorsque l'utilisateur effectue des opérations DML.
  2. Curseurs explicites : Les curseurs explicites sont créés par les utilisateurs chaque fois que l'utilisateur en a besoin. Les curseurs explicites sont utilisés pour récupérer les données d'un tableau ligne par ligne.

Comment créer un curseur explicite ?

  1. Déclarer un objet curseur

Syntaxe:

DECLARE nom_curseur CURSOR FOR SELECT * FROM nom_table

Requête:



DECLARE s1 CURSOR FOR SELECT * FROM studDetails>

2. Ouvrir la connexion du curseur

Codes couleurs Java

Syntaxe:

OUVRIR connexion_curseur



Requête:

OPEN s1>

Récupérer les données du curseur Il existe un total de 6 méthodes pour accéder aux données à partir du curseur. Ils sont les suivants :

  1. D'ABORD est utilisé pour récupérer uniquement la première ligne de la table des curseurs.
  2. DERNIER est utilisé pour récupérer uniquement la dernière ligne de la table des curseurs.
  3. SUIVANT est utilisé pour récupérer des données dans le sens avant à partir de la table des curseurs.
  4. AVANT est utilisé pour récupérer des données dans le sens inverse à partir de la table du curseur.
  5. ABSOLU n est utilisé pour récupérer le n exactèmeligne du tableau des curseurs.
  6. RELATIF n est utilisé pour récupérer les données de manière incrémentielle et décrémentielle.

Syntaxe:

FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE n/RELATIVE n FROM nom_curseur

Requête:

FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
  • Fermer la connexion du curseur

Syntaxe:

FERMER nom_curseur

Requête:

CLOSE s1>
  • Désallouer la mémoire du curseur

Syntaxe:

DEALLOCATE nom_curseur

Requête:

DEALLOCATE s1>

Comment créer un curseur implicite ?

Un curseur implicite est un curseur automatiquement créé par PL/SQL lorsque vous exécutez une instruction SQL. Vous n'avez pas besoin de déclarer ou d'ouvrir explicitement un curseur implicite. Au lieu de cela, PL/SQL gère le curseur pour vous en arrière-plan.

Pour créer un curseur implicite en PL/SQL, il vous suffit d'exécuter une instruction SQL. Par exemple, pour récupérer toutes les lignes de la table EMP, vous pouvez utiliser le code suivant :

Requête:

BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;>

En PL/SQL, lorsque nous effectuons INSÉRER , MISE À JOUR ou SUPPRIMER opérations, un curseur implicite est automatiquement créé. Ce curseur contient les données à insérer ou identifie les lignes à mettre à jour ou à supprimer. Vous pouvez appeler ce curseur le curseur SQL dans votre code. Ce curseur SQL possède plusieurs attributs utiles.

  1. %FOUND est vrai si l'opération SQL la plus récente a affecté au moins une ligne.
  2. %NOTFOUND est vrai s’il n’affecte aucune ligne.
  3. %ROWCOUNT renvoie le nombre de lignes affectées.
  4. %ISOPEN vérifie si le curseur est ouvert.

En plus de ces attributs, %BULK_ROWCOUNT et %BULK_EXCEPTIONS sont spécifiques à l'instruction FORALL, qui est utilisée pour effectuer plusieurs opérations DML à la fois. %BULK_ROWCOUNT renvoie le nombre de lignes affectées par chaque opération DML, tandis que %BULK_EXCEPTION renvoie toute exception survenue pendant les opérations.

Requête:

CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>

Sortir:

img1

Ce programme met à jour une table en augmentant le salaire de chaque employé de 1500. Après la mise à jour, l'attribut SQL%ROWCOUNT permet de connaître combien de lignes ont été affectées par l'opération.

Requête:

DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>

Sortir:

5 Emp selected PL/SQL procedure successfully completed.>

Exceptions de curseur SQL

Chaque fois que nous exécutons une requête SQL, il existe un risque d'erreur inattendue. Le curseur parcourt chaque ensemble de lignes à renvoyer dans une requête SQL.

Il existe quelques exceptions très courantes :

  1. Valeur en double : Ce type d'erreur se produit lorsque le curseur tente d'insérer un enregistrement ou un tuple qui existe déjà dans la base de données. ces types d'erreurs peuvent être évités en gérant correctement la configuration des erreurs
  2. État du curseur invalide : Chaque fois que le curseur est dans un état invalide, ce type d'erreur s'affichera comme une erreur.
  3. Délai de verrouillage : Cela se produit lorsque le curseur tente d'obtenir un verrou sur une ligne ou une table mais que le verrou est déjà détenu par une autre transaction.

Besoin de curseur dans un serveur SQL

  1. Les curseurs nous permettent de traiter les données ligne par ligne, ce qui peut être utile lorsque nous devons effectuer des calculs ou des transformations complexes sur les données.
  2. Les curseurs nous permettent de parcourir plusieurs fois un ensemble de résultats, ce qui peut être utile lorsque nous devons effectuer plusieurs opérations sur les mêmes données.
  3. Les curseurs peuvent être utiles lorsque nous devons joindre plusieurs tables avec des relations complexes, par exemple lors du traitement de structures de données hiérarchiques ou lors de l'exécution de requêtes récursives.
  4. Les curseurs nous permettent d'effectuer des opérations telles que la mise à jour, la suppression ou l'insertion d'enregistrements en fonction de certaines conditions ou critères.
  5. Les curseurs sont particulièrement utiles lors du traitement des données de plusieurs tables où les relations ne sont pas simples.

Limitations du curseur SQL Server

Comme un curseur présente certaines limitations, il ne doit être utilisé que lorsqu'il n'y a pas d'autre choix. Ces restrictions incluent :

  1. Lors du traitement des données, il impose des verrous sur un sous-ensemble ou sur la table entière.
  2. Le tableau de mise à jour du curseur enregistre une ligne à la fois, ce qui ralentit ses performances.
  3. Bien que les boucles soient plus lentes que les curseurs, elles ont plus de temps système.
  4. Un autre facteur qui influence la vitesse du curseur est la quantité de lignes et de colonnes introduites dans le curseur.

FAQ:

Q.1 Comment éviter les curseurs ?

Répondre:

La fonction principale des curseurs est la navigation dans les tableaux ligne par ligne. Voici quelques méthodes simples pour éviter les curseurs :

Q.2 Comment utiliser la boucle While dans le curseur SQL ?

Répondre:

Utiliser une boucle while, qui permet l'insertion d'un jeu de résultats dans la table temporaire, est le moyen le plus simple d'éviter d'avoir recours à un curseur.

Q.3 Que sont les fonctions définies par l'utilisateur dans SQL Cursor ?

Répondre:

Parfois, l'ensemble de lignes résultant est calculé à l'aide de curseurs. Nous pouvons y parvenir en employant une fonction définie par l'utilisateur et conforme aux spécifications.

Q.4 Utilisation des jointures avec le curseur SQL ?

Répondre:

Dans les cas où des enregistrements volumineux doivent être traités, join réduit le nombre de lignes de code en traitant uniquement les colonnes qui remplissent la condition spécifiée.