PL/SQL - Curseurs : Votre Passerelle vers la Manipulation des Données

Bonjour à tous, futurs magiciens de la base de données ! Aujourd'hui, nous allons entreprendre un voyage passionnant dans le monde des curseurs PL/SQL. Ne vous inquiétez pas si vous êtes nouveaux dans la programmation - je serai votre guide amical, et nous explorerons ce sujet pas à pas. À la fin de ce tutoriel, vous manipulerez les curseurs comme un pro !

PL/SQL - Cursors

Qu'est-ce que les Curseurs ?

Avant de plonger dedans, comprenons ce qu'est un curseur. Imaginez que vous êtes à un buffet (je sais, je vous rends déjà faim !). Vous avez une assiette (votre programme) et vous regardez tous les plats délicieux (votre base de données). Un curseur est comme votre main - il vous aide à picking certains éléments du buffet et à les mettre sur votre assiette. En termes de base de données, un curseur vous permet de récupérer et de manipuler des données de votre base de données, une ligne à la fois.

Maintenant, explorons les deux types de curseurs en PL/SQL :

Curseurs Implicites

Les curseurs implicites sont comme les fonctions automatiques sur votre appareil photo - ils travaillent en arrière-plan sans que vous ayez à faire grand-chose. Oracle crée et gère ces curseurs pour vous lorsque vous exécutez des instructions SQL.

Regardons un exemple :

BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 20;

IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Les employés ont reçu une augmentation de 10% !');
ELSE
DBMS_OUTPUT.PUT_LINE('Aucun employé dans le département 20 trouvé.');
END IF;
END;
/

Dans ce code :

  1. Nous mettons à jour le salaire des employés du département 20.
  2. SQL%FOUND est un attribut du curseur implicite qui renvoie TRUE si la mise à jour a affecté des lignes.
  3. Nous utilisons cela pour afficher un message approprié.

D'autres attributs utiles de curseurs implicites incluent :

  • SQL%ROWCOUNT : Nombre de lignes affectées
  • SQL%ISOPEN : Toujours renvoie FALSE pour les curseurs implicites
  • SQL%NOTFOUND : Opposé de SQL%FOUND

Curseurs Exprimés

Les curseurs exprimés sont comme le mode manuel sur votre appareil photo - vous avez plus de contrôle, mais vous devez les gérer vous-même. Ils sont parfaits lorsque vous avez besoin de traiter des lignes une à une ou lorsque vous souhaitez plus de contrôle sur le processus de récupération des données.

Decomposons le cycle de vie d'un curseur exprimé :

Déclarer le Curseur

Premièrement, nous devons indiquer à notre bloc PL/SQL quelles données nous voulons travailler. C'est comme décider ce que vous voulez manger au buffet avant de commencer à remplir votre assiette.

DECLARE
CURSOR c_emp IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30;

Ici, nous avons déclaré un curseur nommé c_emp qui va récupérer les détails des employés du département 30.

Ouvrir le Curseur

Maintenant que nous avons décidé ce que nous voulons, il est temps d'approcher le buffet (ou dans notre cas, la base de données).

OPEN c_emp;

Cette ligne indique à Oracle d'exécuter l'instruction SELECT et de préparer le jeu de résultats.

Récupérer le Curseur

C'est là que nous commencerons à mettre de la nourriture sur notre assiette - ou en termes de programmation, à récupérer les données ligne par ligne.

DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp_id, v_first_name, v_last_name;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id || ' - ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_emp;
END;
/

Dans cet exemple :

  1. Nous déclarons des variables pour stocker les données récupérées.
  2. Nous ouvrons le curseur.
  3. Nous utilisons une boucle pour récupérer les lignes une par une.
  4. Nous quittons la boucle lorsque plus de lignes ne sont disponibles (c_emp%NOTFOUND).
  5. Nous affichons les détails de chaque employé.

Fermer le Curseur

Comme vous rendriez votre assiette après avoir fini à un buffet, nous devons fermer notre curseur lorsque nous avons terminé.

CLOSE c_emp;

Cela libère les ressources associées au curseur.

Boucles Curseur FOR : Un Astuce

Maintenant, j'ai un petit secret pour vous. Il y a un moyen de rendre le travail avec les curseurs encore plus facile - c'est ce qu'on appelle une boucle Curseur FOR. C'est comme avoir un ami serviable au buffet qui remplit votre assiette pour vous !

BEGIN
FOR emp_rec IN (SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ' - ' ||
emp_rec.first_name || ' ' ||
emp_rec.last_name);
END LOOP;
END;
/

Cette boucle magique fait tout le travail pour vous :

  1. Elle déclare une variable de enregistrement (emp_rec) pour contenir chaque ligne.
  2. Elle ouvre le curseur, récupère chaque ligne, et ferme le curseur automatiquement.
  3. Vous n'avez qu'à vous concentrer sur ce que faire avec chaque ligne à l'intérieur de la boucle.

Méthodes de Curseurs : Votre Outil Pratique

Récapitulons les méthodes que nous pouvons utiliser avec les curseurs dans un tableau net :

Méthode Description
DECLARE Définit le curseur et son instruction SELECT
OPEN Exécute l'instruction SELECT et prépare le jeu de résultats
FETCH Récupère la prochaine ligne du jeu de résultats
CLOSE Ferme le curseur et libère les ressources

Souvenez-vous, avec un grand pouvoir vient une grande responsabilité. Fermez toujours vos curseurs lorsque vous avez terminé pour libérer les ressources !

Et voilà, mes chers étudiants ! Vous avez fait vos premiers pas dans le monde des curseurs PL/SQL. Pratiquez ces concepts, jouez avec différents scénarios, et bientôt vous naviguerez dans vos bases de données avec la grâce et la précision d'un programmeur chevronné.

Souvenez-vous, dans la programmation, comme dans la vie, la clé est de continuer à apprendre et à expérimenter. Alors, allez-y, écrivez du code, faites des erreurs, et surtout, amusez-vous ! Qui sait ? La prochaine grande application de base de données pourrait bien être entre vos doigts. Bon codage !

Credits: Image by storyset