Wednesday 8 June 2011

Oracle PL-SQL: Division par zero

Erreur Oracle -PL-SQL

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.

No comments:

Post a Comment