Exercices Corrigés PL/SQL: Curseurs

La meilleure façon d’apprendre quelque chose est de pratiquer des exercices. Nous avons préparer ces exercices corrigés pour les personnes (débutantes ou intermédiaires) qui sont familières avec PL/SQL. Nous espérons que ces exercices vous aideront à améliorer vos compétences en PL/SQL. Les exercices corrigés suivantes sont actuellement disponibles, nous travaillons dur pour ajouter plus d’exercices. Bon apprentissage!

Vous pouvez lire notre tutoriel PL/SQL avant de résoudre les exercices suivants.

 
 

Exercices corrigés PL/SQL: Curseurs

1. Écrire un programme PL/SQL pour afficher les noms de tous les pays.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
DECLARE
  nom_pays pays.nom%TYPE;
  CURSOR c_pays IS SELECT nom FROM pays;
BEGIN
  OPEN c_pays;
  FETCH c_pays INTO nom_pays;
  WHILE c_pays%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE(nom_pays);
    FETCH c_pays INTO nom_pays;
  END LOOP;
  CLOSE c_pays;
END;

Sortie:

Angola
Australia
Albania
Bangladesh
Andorra
Bolivia

 

2. Écrire un programme PL/SQL pour afficher les noms de tous les clients.

Table: clients

+-----------+----------------+-------------+--------+----------------+
| client_id |     nom_cl     |    ville    |  age   | fournisseur_id |
+-----------+----------------+-------------+--------+----------------+
|    1001   | Alex Barbara   | Paris       |  25    |      6001      |
|    1002   | Lois Collins   | Lyon        |  30    |      6001      |
|    1005   | Karen Farley   | Nice        |  44    |      6002      |
|    1006   | Kevin Thompson | Paris       |  65    |      6003      |
|    1007   | Scott Henry    | Marseille   |  32    |      6006      |
|    1003   | Ellen McMullen | Montpellier |  53    |      6001      |
+-----------+----------------+-------------+--------+----------------+
DECLARE
  nom_client clients.nom_cl%TYPE;
  CURSOR c_clients IS SELECT nom_cl FROM clients;
BEGIN
  OPEN c_clients;
  FETCH c_clients INTO nom_client;
  WHILE c_clients%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE(nom_client);
    FETCH c_clients INTO nom_client;
  END LOOP;
  CLOSE c_clients;
END;

Sortie:

Alex Barbara
Lois Collins
Karen Farley
Kevin Thompson
Scott Henry
Ellen McMullen

 

3. Écrire un programme PL/SQL pour afficher les identifiants des pays et les noms de tous les pays avec le titre approprié.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
DECLARE
p_id pays.pays_id%TYPE;
p_nom pays.nom%TYPE;
  CURSOR c_pays IS SELECT pays_id, nom FROM pays;
BEGIN
  DBMS_OUTPUT.PUT_LINE('   ID   |    Nom    ');
  DBMS_OUTPUT.PUT_LINE('--------------------');
  OPEN c_pays;
  FETCH c_pays INTO p_id, p_nom;
  WHILE c_pays%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE(p_id || '  |  ' || p_nom);
    FETCH c_pays INTO p_id, p_nom;
  END LOOP;
  CLOSE c_pays;
END;
/

Sortie:

   ID   |    Nom    
--------------------
1001    |   Angola
1002    |   Australia
1005    |   Albania
1006    |   Bangladesh
1007    |   Andorra
1003    |   Bolivia

 

 
 
4. Écrire un programme PL/SQL pour afficher les identifiants, noms, prénoms et les noms de départements de tous les employés.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 1              |
| 1002 | Eleanor | Deas     | 4500.00  | 2              |
| 1003 | Glen    | Powell   | 5000.00  | 3              |
| 1004 | Ali     | Fawaz    | 7800.00  | 4              |
| 1005 | Earl    | Horn     | 9000.00  | 5              |
| 1006 | Bryan   | Savoy    | 8000.00  | 6              |
+------+---------+----------+----------+----------------+
Table: departements

+---------+----------------+
| dep_id  |       nom      |
+---------+----------------+
|  1      | Marketing      |
|  2      | Finance        |
|  3      | HR             |
|  4      | Informatique   |
|  5      | Expéditions    |
|  6      | Administration |
+---------+----------------+
DECLARE
id_emp employees.id%TYPE;
nom_emp employees.nom%TYPE;
pren_emp employees.prenom%TYPE;
nom_dep departements.nom%TYPE;
  CURSOR emp_cursor IS
    SELECT emp.id, emp.nom, emp.prenom, dep.dep_id
    FROM employees emp
    JOIN departements dep ON emp.department_id = dep.dep_id;
BEGIN
  OPEN emp_cursor;
  FETCH emp_cursor INTO id_emp, pren_emp, nom_emp, nom_dep;
  WHILE emp_cursor%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE('ID de l\'employé: ' || id_emp);
    DBMS_OUTPUT.PUT_LINE('Prénom de l\'employé: ' || pren_emp);
    DBMS_OUTPUT.PUT_LINE('Nom de l\'employé: ' || nom_emp);
    DBMS_OUTPUT.PUT_LINE('Nom du département: ' || nom_dep);
    DBMS_OUTPUT.PUT_LINE('--------------------------------');
    FETCH emp_cursor INTO id_emp, pren_emp, nom_emp, nom_dep;
  END LOOP;
  CLOSE emp_cursor;
END;

Sortie:

ID de l'employé: 1001
Prénom de l'employé: Parker
Nom de l'employé : Eddie
Nom du département : Marketing
--------------------------------
ID de l'employé: 1002
Prénom de l'employé: Deas
Nom de l'employé : Eleanor
Nom du département : Finance
--------------------------------
ID de l'employé: 1003
Prénom de l'employé: Powell
Nom de l'employé : Glen
Nom du département : HR
--------------------------------
... etc.

 

5. Écrire un programme en PL/SQL pour trouver le nombre de lignes affectées par l’utilisation de l’attribut SQL%ROWCOUNT d’un curseur implicite.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
BEGIN
    UPDATE pays
    SET    nom = 'PAYS'
    WHERE  nom LIKE 'A%';

    dbms_output.Put_line('Nombre d\'enregistrements mis à jour: '||To_char(SQL%rowcount));
END;
/ 

Sortie:

Nombre d'enregistrements mis à jour: 4

 

 
 
6. Écrire un programme en PL/SQL pour montrer l’utilisation de SQL%FOUND afin de déterminer si l’instruction DELETE a affecté des lignes.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
CREATE OR REPLACE PROCEDURE delete_pays (
  p_pays_id NUMBER
) AUTHID DEFINER AS
BEGIN
  DELETE FROM pays
  WHERE pays_id = p_pays_id;
 
  IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE (
      'Suppression réussie pour pays_id: ' || p_pays_id
    );
  ELSE
    DBMS_OUTPUT.PUT_LINE ('Aucun pays de l\'ID '||p_pays_id||' n\'est trouvé.');
  END IF;
END;
/
BEGIN
  delete_pays(1001);
  delete_pays(9999);
END;
/

Sortie:

Suppression réussie pour pays_id: 1001
Aucun employé de l'ID 9999 n'a été trouvé.

 

7. Écrire un programme en PL/SQL pour montrer l’utilisation de SQL%NOTFOUND afin de déterminer si l’instruction UPDATE a affecté des lignes.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
DECLARE
	p_pays_id NUMBER := 1001;
BEGIN
    UPDATE pays
    SET    nom = 'PAYS'
    WHERE pays_id = p_pays_id;
 
  IF SQL%NOTFOUND THEN
      DBMS_OUTPUT.PUT_LINE ('Aucun pays de l\'ID '||p_pays_id||' n\'est trouvé.');
  ELSE
    DBMS_OUTPUT.PUT_LINE (
      'Mise à jour réussie pour pays_id: ' || p_pays_id
    );
  END IF;
END;
/

Sortie:

Mise à jour réussie pour pays_id: 1001

 

 
 
8. Écrire un programme en PL/SQL pour afficher les informations détaillées de l’employé de l’ID 1001 à partir de la table employees.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE 
    r_emp employees%ROWTYPE; 
BEGIN 
    SELECT * 
    INTO   r_emp
    FROM   employees 
    WHERE  id = 1001; 

    dbms_output.Put_line('Employé ID:'||r_emp.id||'  Nom: '||r_emp.prenom||' '||r_emp.nom||'  Salaire:  '||r_emp.salaire); 
END; 
/

Sortie:

Employé :  ID:1001    Nom : Parker Eddie   Salaire : 6000.00

 

9. Ecrire un programme en PL/SQL pour afficher les détails des employés de la table employés à l’aide d’un curseur.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE 
    CURSOR c_emp IS 
      SELECT *
      FROM   employees; 
    r_emp c_emp%ROWTYPE; 
BEGIN 
    OPEN c_emp; 

    LOOP 
        FETCH c_emp INTO r_emp; 

        EXIT WHEN c_emp%NOTFOUND; 

        dbms_output.Put_line('Employé ID:'||r_emp.id||'  Nom: '||r_emp.prenom||' '||r_emp.nom||'  Salaire:  '||r_emp.salaire);
    END LOOP; 

    dbms_output.Put_line('Nombre total de lignes: '||c_emp%rowcount); 

    CLOSE c_emp; 
END;
/

Sortie:

Employé :  ID:1001    Nom : Parker Eddie   Salaire : 6000.00
Employé :  ID:1002    Nom : Deas Eleanor   Salaire : 4500.00
Employé :  ID:1003    Nom : Powell Glen   Salaire : 5000.00
.......

 

 
 
10. Créer un bloc PL/SQL pour augmenter le salaire des employés du département 8 par 100$ si le salaire est inférieure à 5000.00$ sinon augmentez-le par 50$ en utilisant la clause WHERE CURRENT OF.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
Table: departements

+---------+----------------+
| dep_id  |       nom      |
+---------+----------------+
|  1      | Marketing      |
|  2      | Finance        |
|  3      | HR             |
|  4      | Informatique   |
|  5      | Expéditions    |
|  6      | Administration |
+---------+----------------+
DECLARE
    CURSOR emp_cur IS
      SELECT id,
             salaire
      FROM   employees
      WHERE  dep_id = 8
      FOR UPDATE;
    augmentation_sal NUMBER;
BEGIN
    FOR emp IN emp_cur LOOP
        IF emp.salaire < 5000 THEN
          augmentation_sal := 100;
        ELSE
          augmentation_sal := 50;
        END IF;

        UPDATE employees
        SET    salaire = salaire + augmentation_sal
        WHERE  CURRENT OF emp_cur;
    END LOOP;
END;
/

 

11. Ecrire un programme en PL/SQL pour afficher le nom de l'employé avec l'id 1006 à l'aide d'un curseur.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
  nom_emp VARCHAR2(50);
  CURSOR cur_emp IS
    SELECT nom
    FROM   employees
    WHERE  id = 1006;

BEGIN
  OPEN cur_emp;
  FETCH cur_emp
  INTO  nom_emp;
  
  dbms_output.put_line('Le nom de l\'employé est:’|| nom_emp);
  CLOSE cur_emp;
END;
/

Sortie:

Le nom de l'employé est: Bryan

 

 
 
12. Ecrire un programme en PL/SQL pour afficher le nom de tous les employés à l'aide d'un curseur.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
  nom_emp VARCHAR2(20);
  CURSOR cur_emp IS
    SELECT nom
    FROM   employees;

BEGIN
  OPEN cur_emp;
  LOOP
    FETCH cur_emp
    INTO  nom_emp;
    EXIT
  WHEN cur_emp%NOTFOUND;
    dbms_output.put_line('Le nom de l\'employé est:’|| nom_emp);
  END LOOP;
  CLOSE cur_emp;
END;
/

Sortie:

Le nom de l'employé est: Eddie
Le nom de l'employé est: Eleanor
Le nom de l'employé est: Glen
Le nom de l'employé est: Ali
Le nom de l'employé est: Earl
Le nom de l'employé est: Bryan

 

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *