Cours SQL ORACLE – 07-05 : EXCEPTION Partie 2
Dans ce nouveau cours, nous allons voir les EXCEPTION définies par l’utilisateur.
Ces dernières sont en fait lié au réglé de gestions appliquées dans notre programme.
Prenons l’exemple suivant : Nous allons vérifier dans le schéma SCOTT les employés (Table EMP) qui on un salaire qui n’est pas dans la grille des salaire des employés (Table SALGRADE).
Nous allons ajouter en premier lieu des lignes dans la table EMP pour ce cas de figures :
INSERT INTO EMP VALUES (1, 'EMP 1', 'CLERK', 7782, TO_DATE('01/01/1982', 'DD/MM/YYYY'), 100, NULL, 10);
INSERT INTO EMP VALUES (2, 'EMP 2', 'CLERK', 7782, TO_DATE('01/01/1982', 'DD/MM/YYYY'), 200, NULL, 10);
INSERT INTO EMP VALUES (3, 'EMP 3', 'CLERK', 7782, TO_DATE('01/01/1982', 'DD/MM/YYYY'), 300, NULL, 10);
INSERT INTO EMP VALUES (4, 'EMP 4', 'CLERK', 7782, TO_DATE('01/01/1982', 'DD/MM/YYYY'), 800, NULL, 10);
COMMIT;
Nous allons ensuite créer une Bloc PL/SQL pour verifier tout les salariés qui n’ont pas de salaire dans notre grille de salaire:
DECLARE SAL_NON_DEFINIT_GRILLE EXCEPTION; NBR_EMP NUMBER; BEGIN FOR CUR IN (SELECT EMPNO, ENAME, JOB, SAL FROM EMP) LOOP BEGIN SELECT COUNT(*) INTO NBR_EMP FROM SALGRADE WHERE CUR.SAL BETWEEN LOSAL AND HISAL; IF NBR_EMP = 0 THEN RAISE SAL_NON_DEFINIT_GRILLE; END IF; EXCEPTION WHEN SAL_NON_DEFINIT_GRILLE THEN DBMS_OUTPUT.PUT_LINE('ERREUR : L''employé ' || CUR.ENAME || ' Numéro ' || CUR.EMPNO || ' a un salaire qui n''est pas dans la grille : ' || CUR.SAL); END; END LOOP; END;
Le résultat affiché de ce Bloc PL/SQL est le suivant :
ERREUR : L'employé EMP 1 Numéro 1 a un salaire qui n'est pas dans la grille : 100
ERREUR : L'employé EMP 2 Numéro 2 a un salaire qui n'est pas dans la grille : 200
ERREUR : L'employé EMP 3 Numéro 3 a un salaire qui n'est pas dans la grille : 300
Les employé détecté par notre exception sont 1, 2 et 3 vu que leur salaire (100, 200 et 300) ne sont dans une aucune des grilles des salaire.
Donc pour utiliser les exceptions définies par l’utilisateur, on déclare le nom de l’exception dans la partie des déclarations comme étant EXCEPTION, ensuite lorsqu’on veut faire appel à cette exception nous utilisons la commande RAISE puis le nom de cette exception.
Nous pouvons faire appel à plusieurs exception comme le montre l’exemple suivant :
DECLARE SAL_NON_DEFINIT_GRILLE EXCEPTION; SAL_DEFINIT_GRILLE EXCEPTION; NBR_EMP NUMBER; BEGIN FOR CUR IN (SELECT EMPNO, ENAME, JOB, SAL FROM EMP) LOOP BEGIN SELECT COUNT(*) INTO NBR_EMP FROM SALGRADE WHERE CUR.SAL BETWEEN LOSAL AND HISAL; IF NBR_EMP = 0 THEN RAISE SAL_NON_DEFINIT_GRILLE; ELSE RAISE SAL_DEFINIT_GRILLE; END IF; EXCEPTION WHEN SAL_NON_DEFINIT_GRILLE THEN DBMS_OUTPUT.PUT_LINE('ERREUR : L''employé ' || CUR.ENAME || ' Numéro ' || CUR.EMPNO || ' a un salaire qui n''est pas dans la grille : ' || CUR.SAL); WHEN SAL_DEFINIT_GRILLE THEN DBMS_OUTPUT.PUT_LINE('INFO : L''employé ' || CUR.ENAME || ' Numéro ' || CUR.EMPNO || ' a un salaire qui est dans la grille : ' || CUR.SAL); END; END LOOP; END;
Le résultat affiché de ce Bloc PL/SQL est le suivant :
ERREUR : L'employé EMP 1 Numéro 1 a un salaire qui n'est pas dans la grille : 100
ERREUR : L'employé EMP 2 Numéro 2 a un salaire qui n'est pas dans la grille : 200
ERREUR : L'employé EMP 3 Numéro 3 a un salaire qui n'est pas dans la grille : 300
INFO : L'employé EMP 4 Numéro 4 a un salaire qui est dans la grille : 800
INFO : L'employé SMITH Numéro 7369 a un salaire qui est dans la grille : 800
INFO : L'employé ALLEN Numéro 7499 a un salaire qui est dans la grille : 1600
INFO : L'employé WARD Numéro 7521 a un salaire qui est dans la grille : 1250
INFO : L'employé JONES Numéro 7566 a un salaire qui est dans la grille : 2975
INFO : L'employé MARTIN Numéro 7654 a un salaire qui est dans la grille : 1250
INFO : L'employé BLAKE Numéro 7698 a un salaire qui est dans la grille : 2850
INFO : L'employé CLARK Numéro 7782 a un salaire qui est dans la grille : 2450
INFO : L'employé SCOTT Numéro 7788 a un salaire qui est dans la grille : 3000
INFO : L'employé KING Numéro 7839 a un salaire qui est dans la grille : 5000
INFO : L'employé TURNER Numéro 7844 a un salaire qui est dans la grille : 1500
INFO : L'employé ADAMS Numéro 7876 a un salaire qui est dans la grille : 1100
INFO : L'employé JAMES Numéro 7900 a un salaire qui est dans la grille : 950
INFO : L'employé FORD Numéro 7902 a un salaire qui est dans la grille : 3000
INFO : L'employé MILLER Numéro 7934 a un salaire qui est dans la grille : 1300
Enfin, nous pouvons dans un bloc PL/SQL définir une erreur comme étant une EXCEPTION système en utilisant la fonction RAISE_APPLICATION_ERROR qui prend deux paramètres : le code erreur et le libelle de l’erreur.
Nous allons reprendre l’exemple précédent mais cette fois-ci, dés qu’un employé n’a pas de salaire définit dans notre tranche, le programme sortira en erreur et affichera le message d’erreur comme étant un message d’erreur système :
DECLARE NBR_EMP NUMBER; BEGIN FOR CUR IN (SELECT EMPNO, ENAME, JOB, SAL FROM EMP) LOOP SELECT COUNT(*) INTO NBR_EMP FROM SALGRADE WHERE CUR.SAL BETWEEN LOSAL AND HISAL; IF NBR_EMP = 0 THEN RAISE_APPLICATION_ERROR(-20000, 'Salaire pas dans la grille'); END IF; END LOOP; END;
Le résultat affiché par cette exécution est comme celui d’une erreur système:
Rapport d'erreur :
ORA-20000: Salaire pas dans la grille
ORA-06512: à ligne 12
Le code erreur affiché est celui qu’on définit comme premier paramètre de la fonction RAISE_APPLICATION_ERROR, il doit être compris entre -20000 et -20999. Le libellé saisi est celui de l’erreur affichée.