Exercices Corrigés PL/SQL: Exceptions

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: Les exceptions

1. Écrire un bloc PL/SQL pour générer une exception lors d’une division par zéro. Exemple:

dividende = 5;
diviseur = 0;
Erreur : Division par zéro
DECLARE
dividende   NUMBER := 5;
diviseur    NUMBER := 0;
res         NUMBER;
BEGIN
   BEGIN
      result := dividende / diviseur;
      DBMS_OUTPUT.PUT_LINE('Résultat: ' || res);
   EXCEPTION
      WHEN ZERO_DIVIDE THEN
         DBMS_OUTPUT.PUT_LINE('Erreur : Division par zéro');
   END;
END;

Sortie:

Erreur : Division par zéro

 

2. Traiter l’exception NO_DATA_FOUND lors de l’extraction d’une ligne d’une table et qu’aucun enregistrement correspondant n’est trouvé.

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      |
+-----------+----------------+-------------+--------+----------------+

Exemple:

SELECT nom_cl FROM clients WHERE client_id = 9999;
Erreur : Aucun enregistrement correspondant n'a été trouvé
DECLARE
   client_nom   VARCHAR2(50);
   clientId     NUMBER := 9999;
BEGIN
   BEGIN
      SELECT nom_cl INTO client_nom FROM clients WHERE client_id = clientId;
      DBMS_OUTPUT.PUT_LINE('Nom du client: ' || client_nom);
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         DBMS_OUTPUT.PUT_LINE('Erreur : Aucun enregistrement correspondant n\'a été trouvé');
   END;
END;

Sortie:

Erreur : Aucun enregistrement correspondant n'a été trouvé

 

3. Traiter l’exception TOO_MANY_ROWS lors de la récupération de plusieurs lignes au lieu d’une seule dans une table.

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    |      6001      |
|    1006   | Kevin Thompson | Paris       |  65    |      6003      |
+-----------+----------------+-------------+--------+----------------+

Exemple:

SELECT * FROM clients WHERE fournisseur_id = 6001;
Plusieurs lignes trouvées pour l'identifiant du fournisseur: 6001
DECLARE
  fourn_id clients.fournisseur_id%TYPE := 6001;
BEGIN
  SELECT *
  FROM clients
  WHERE fournisseur_id = fourn_id;
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('Plusieurs lignes trouvées pour l\'identifiant du fournisseur: ' || fourn_id);
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Erreur: ' || SQLERRM);
END;

Sortie:

Plusieurs lignes trouvées pour l'identifiant du fournisseur: 6001

 

 
 
4. Traiter l’exception INVALID_NUMBER lors de la conversion d’une valeur non numérique en un nombre. Exemple:

'hello' -> Number (Erreur : Nombre invalide)
DECLARE
  input VARCHAR2(20) := 'hello';
  nbr NUMBER;
BEGIN
  BEGIN
    nbr := TO_NUMBER(input);
    DBMS_OUTPUT.PUT_LINE('Conversion réussie. Nombre: ' || nbr);
  EXCEPTION
    WHEN INVALID_NUMBER THEN
      DBMS_OUTPUT.PUT_LINE('Erreur : Nombre invalide');
  END;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Erreur: ' || SQLERRM);
END;
/

Sortie:

Erreur : Nombre invalide

 

5. Traiter l’exception DUP_VAL_ON_INDEX lors de l’insertion d’une valeur dupliquée dans une table avec une contrainte unique.

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    |      6001      |
|    1006   | Kevin Thompson | Paris       |  65    |      6003      |
+-----------+----------------+-------------+--------+----------------+

Exemple:

INSERT INTO clients (client_id) VALUES (1001);
Erreur : Une valeur en double existe déjà.
DECLARE
valeur_duplique NUMBER := 1001;
BEGIN
  BEGIN
    INSERT INTO clients (client_id) VALUES (valeur_duplique);
    DBMS_OUTPUT.PUT_LINE('L\'insertion a été effectuée avec succès.');
  EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
      DBMS_OUTPUT.PUT_LINE('Erreur : Une valeur en double existe déjà.');
  END;
END;
/

Sortie:

Erreur : Une valeur en double existe déjà.

 

6. Gérer l’exception VALUE_ERROR lors de l’affectation d’une valeur incompatible à une variable. Exemple:

Number =  'hello' (Affectation de valeurs incompatibles)
DECLARE
client_id NUMBER;
input VARCHAR2(25) := 'hello';
res NUMBER;
  BEGIN 
     BEGIN
      client_id := TO_NUMBER(input);
      DBMS_OUTPUT.PUT_LINE('Affectation réussie.');
      res := input; 
      DBMS_OUTPUT.PUT_LINE('Résultat: ' || res);
    EXCEPTION
      WHEN VALUE_ERROR THEN
        DBMS_OUTPUT.PUT_LINE('Erreur : Message d\'exception VALUE_ERROR');
        DBMS_OUTPUT.PUT_LINE('Affectation de valeurs incompatibles.');
     END;
END;
/

Sortie:

Erreur : Message d'exception VALUE_ERROR
Affectation de valeurs incompatibles.

 

 
 
7. Traiter l’exception PROGRAM_ERROR lorsqu’un programme PL/SQL rencontre une erreur interne. Exemple:

Si 20 > 5 alors (levez une erreur interne)
DECLARE
erreur_interne EXCEPTION;
message_erreur VARCHAR2(5000);
nbr NUMBER := 20; 
BEGIN
  IF nbr > 5 THEN
    --déclencher l'erreur interne
    RAISE erreur_interne; 
  END IF;
EXCEPTION
  WHEN erreur_interne THEN
    message_erreur := SQLERRM;
    DBMS_OUTPUT.PUT_LINE('Erreur interne: ' || message_erreur);
END;
/

Sortie:

Erreur interne : Exception définie par l'utilisateur

 

8. Traiter l’exception ACCESS_INTO_NULL lors d’une tentative d’accès à un enregistrement NULL.

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 = 9999; 

  IF r_emp IS NULL THEN
    RAISE ACCESS_INTO_NULL;
  END IF;
  
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Aucune donnée trouvée pour id 9999');
  WHEN ACCESS_INTO_NULL THEN
    DBMS_OUTPUT.PUT_LINE('Exception ACCESS_INTO_NULL : Essayer d\'accéder à la valeur NULL pour id 9999');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Une erreur est survenue: ' || SQLERRM);
END; 
/

Sortie:

Exception ACCESS_INTO_NULL : Essayer d'accéder à la valeur NULL pour id 9999

 

 

Laisser un commentaire

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