Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
17 mai 2011 2 17 /05 /mai /2011 00:09

 

Oracle PL/SQL NO_DATA_FOUND et TOO_MANY_ROWS EXCEPTIONS.

Comment gérer l'erreur Oracle ORA-01403: no data found dans un bloc EXCEPTION PLSQL ?
Comment gérer l'erreur Oracle ORA-01422: exact fetch returns more than requested number of rows dans un bloc EXCEPTION PLSQL ?

PL/SQL a un mécanisme de gestion des erreurs qui permet de traiter ces évènements dans le BLOC EXCEPTION.

Cette requête SELECT INTO doit renvoyer impérativement 1 seul enregistrement sinon une erreur est declenchée.

Voici deux exemples (avec et sans gestion des erreurs) ou PLSQL soulève :

EXCEPTION prédéfinie NO_DATA_FOUND si aucune ligne n'est retournée (empno = 789 introuvable).
EXCEPTION prédéfinie TOO_MANY_ROWS si plusieurs lignes sont retournées (job = 'SALESMAN' 4 enreg. retournés).

EXCEPTION prédéfinie NO_DATA_FOUND.

 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE empno = 789; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 11 END; 12 / DECLARE * ERROR at line 1: ORA-01403: no data found ORA-06512: at line 5 
 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE empno = 789; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 EXCEPTION 11 WHEN NO_DATA_FOUND THEN 12 dbms_output.put_line(SQLERRM(SQLCODE)||' SALARIE INNEXISTANT !!'); 13 WHEN OTHERS THEN 14 dbms_output.put_line('Autres Erreurs'); 15 END; 16 / ORA-01403: no data found SALARIE INNEXISTANT !! PL/SQL procedure successfully completed. 

 

EXCEPTION prédéfinie TOO_MANY_ROWS.

 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE job = 'SALESMAN'; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 11 END; 12 / DECLARE * ERROR at line 1: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at line 5 
 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE job = 'SALESMAN'; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 EXCEPTION 11 WHEN TOO_MANY_ROWS THEN 12 dbms_output.put_line(SQLERRM(SQLCODE)||' Ce Job n''est pas Unique !!'); 13 WHEN OTHERS THEN 14 dbms_output.put_line('Autres Erreurs'); 15 END; 16 / ORA-01422: exact fetch returns more than requested number of rows Ce Job n'est pas Unique !! PL/SQL procedure successfully completed. 

Lorsque le traitement a été transferé du bloc BEGIN dans le BLOC EXCEPTION, il n'est plus possible de revenir dans le corps du bloc BEGIN (sauf utilisation de blocs imbriquées).
Quand le programme prend en compte l’erreur dans une entrée WHEN, les instructions de cette entrée sont exécutées et le programme se termine.

 

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• Oracle PL-SQL Structure d'un BLOC
• Oracle PL-SQL SELECT INTO
• Oracle PL-SQL Variables %TYPE %ROWTYPE

Partager cet article

Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article

commentaires