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).
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. |
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 |