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:
DBMS_OUTPUT.PUT_LINE('Erreur : Division par zéro');
END;
END;
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;
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é
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
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;
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
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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);
WHENOTHERSTHEN
DBMS_OUTPUT.PUT_LINE('Erreur: ' || SQLERRM);
END;
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;
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:
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;
/
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;
/
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)
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');
WHENOTHERSTHEN
DBMS_OUTPUT.PUT_LINE('Une erreur est survenue: ' || SQLERRM);
END;
/
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;
/
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