Oracle PL/SQL Gestion des éxception Utilisateur avec le RAISE.
Definition d'une EXCEPTION non associee à une erreur Oracle ?
PL/SQL permet de definir ses propres EXCEPTIONS, avec la commande RAISE qui interrompt le programme et transfère au gestionnaire d'EXCEPTION.
La déclaration du nom de l'exception doit se trouver dans la partie déclarative.
Voici un exemple (avec et sans gestion des erreurs) ou PLSQL soulève :
? EXCEPTION UTILISATEUR e_dept_innexistant car le département40 n'existe pas dans la base.
On s’aperçoit que pour la même requête nous avons deux messages bien différent.
APPEL EXCEPTION UTILISATEUR avec RAISE.
SQL> SET SERVEROUTPUT ON; SQL> BEGIN 2 DELETE FROM emp WHERE deptno = 40; 3 COMMIT; 4 dbms_output.put_line('Lignes departement 40 supprimees'); 5 END; 6 / Lignes departement 40 supprimees PL/SQL procedure successfully completed. |
SQL> SET SERVEROUTPUT ON; SQL> DECLARE 2 dept_InnexistantEXCEPTION; 3 BEGIN 4 DELETE FROM emp WHERE deptno =40; 5 IF sql%NOTFOUND THEN 6 RAISE dept_Innexistant; 7 END IF; 8 COMMIT; 9 dbms_output.put_line('Lignes departement40 supprimees'); 10 11 EXCEPTION 12 WHEN dept_InnexistantTHEN 13 dbms_output.put_line('Departement40 innexistant'); 14 WHEN OTHERS THEN 15 dbms_output.put_line('Autres Erreurs'); 16 END; 17 / Departement 40 innexistant PL/SQL procedure successfully completed. |
----------------------------------------------------------------------------------- ------------------------------------------------------------------------------------
Oracle PL/SQL ERROR CURSOR ZERO_DIVIDE EXCEPTIONS.
Comment gérer l'érreur Oracle ORA-01476: divisor is equal to zero dans un bloc EXCEPTION PLSQL ?
PL/SQL dispose d'un mécanisme de gestion des érreurs qui permet de traiter ces évènements dans le BLOC EXCEPTION.
Ce curseur c_emp renvoit des enregistrements dont le champ v_emp.comm qui renvoit des valeurs égales à 0. Céla provoque une division par zéro.
Voici un exemple (avec et sans gestion des érreurs) ou PLSQL soulève :
? EXCEPTION prédéfinie ZERO_DIVIDE si v_emp.comm=0.
EXCEPTION prédéfinie ZERO_DIVIDE.
SQL> SET SERVEROUTPUT ON; SQL> DECLARE 2 v_eval_prime emp.comm%type; 3 v_emp emp%rowtype; 4 CURSOR c_emp IS 5 SELECT ename, job, comm, sal 6 FROM emp 7 WHERE deptno = 20; 8 BEGIN 9 OPEN c_emp; 10 LOOP 11 FETCH c_emp INTO v_emp.ename, v_emp.job, v_emp.comm, v_emp.sal; 12 EXIT WHEN c_emp%NOTFOUND; 13 v_eval_prime := v_emp.comm + (v_emp.sal/v_emp.comm); 14 dbms_output.put_line('Name = '||v_emp.ename || ' Job = ' || v_emp.job || 15 ' Nouvelle Prime = ' ||v_eval_prime); 16 END LOOP; 17 CLOSE c_emp; 18 END; 19 / Name = ALLEN Job = SALESMAN Nouvelle Prime = 305.33 Name = WARD Job = SALESMAN Nouvelle Prime = 480.5 Name = MARTIN Job = SALESMAN Nouvelle Prime = 1400.89 Name = BLAKE Job = MANAGER Nouvelle Prime = DECLARE * ERROR at line 1: ORA-01476: divisor is equal to zero ORA-06512: at line 13 |
SQL> SET SERVEROUTPUT ON; SQL> DECLARE 2 v_eval_prime emp.comm%type; 3 v_emp emp%rowtype; 4 CURSOR c_emp IS 5 SELECT ename, job, comm, sal 6 FROM scott.emp 7 WHERE deptno = 30; 8 BEGIN 9 OPEN c_emp; 10 LOOP 11 FETCH c_emp INTO v_emp.ename, v_emp.job, v_emp.comm, v_emp.sal; 12 EXIT WHEN c_emp%NOTFOUND; 13 v_eval_prime := v_emp.comm + (v_emp.sal/v_emp.comm); 14 dbms_output.put_line('Name = '||v_emp.ename || ' Job = ' || v_emp.job || 15 ' Re-evaluation Prime = ' ||v_eval_prime); 16 END LOOP; 17 CLOSE c_emp; 18 EXCEPTION 19 WHEN ZERO_DIVIDE THEN 20 dbms_output.put_line(SQLERRM(SQLCODE)||' SALARIE SANS PRIME !!'); 21 WHEN OTHERS THEN 22 dbms_output.put_line('Autres Erreurs'); 23 END; 24 / Name = ALLEN Job = SALESMAN Re-evaluation Prime = 305.33 Name = WARD Job = SALESMAN Re-evaluation Prime = 480.5 Name = MARTIN Job = SALESMAN Re-evaluation Prime = 1400.89 Name = BLAKE Job = MANAGER Re-evaluation Prime = ORA-01476: divisor is equal to zero SALARIE SANS PRIME !! PL/SQL procedure successfully completed. |
Quand le programme prend en compte l’érreur dans une entrée WHEN, les instructions de cette entrée sont exécutées et le programme se termine.