Oracle PL/SQL NO_DATA_FOUND et TOO_MANY_ROWS EXCEPTIONS.
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 = 889 introuvable).
? EXCEPTION prédéfinie TOO_MANY_ROWS si plusieurs lignes sont retournées (job = 'ANALYSTE' 4 enreg. retournés).
I- EXCEPTION prédéfinie NO_DATA_FOUND.
DECLARE *SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename emp.ename%type; 3 v_job emp.job%type; 4 v_sal emp.sal%type; 5 BEGIN 6 SELECT ename, job, sal 7 INTO v_ename, v_job,v_sal 8 FROM emp 9 WHERE empno = 889; 10 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal); 11 END; /
ERROR at line 1: ORA-01403: no data found ORA-06512: at line 6
Traitement de l'erreur :Introduire la clause EXCEPTIONSQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename emp.ename%type; 3 v_job emp.job%type; 4 v_sal emp.sal%type; 4 BEGIN 5 SELECT ename, job,sal 6 INTO v_ename, v_job,sal 7 FROM emp 8 WHERE empno = 889; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal); 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; /
ORA-01403: no data found SALARIE INNEXISTANT !! PL/SQL procedure successfully completed.
II- EXCEPTION prédéfinie TOO_MANY_ROWS.DECLARE *SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename emp.ename%type; 3 v_job emp.job%type; 4 v_sal emp.sal%type; 5 BEGIN 6 SELECT ename, job, sal 7 INTO v_ename, v_job,v_sal 8 FROM emp 9 WHERE job = 'ANALYSTE'; 10 dbms_output.put_line('Nom = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal); 11 END; /
ERROR at line 1: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at line 6
Traitement de l'erreur :Introduire la clause EXCEPTIONSQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename emp.ename%type; 3 v_job emp.job%type; 4 v_sal emp.job%type; 5 BEGIN 6 SELECT ename, job 7 INTO v_ename, v_job 8 FROM scott.emp 9 WHERE job = 'ANALYSTE'; 10 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job||'Salaire: '||v_sal); 11 EXCEPTION 12 WHEN TOO_MANY_ROWS THEN 13 dbms_output.put_line(SQLERRM(SQLCODE)||' Ce Job n''est pas Unique !!'); 14 WHEN OTHERS THEN 15 dbms_output.put_line('Autres Erreurs'); 16 END; 17 /
>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 est transferé 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. pour remedier au problemme de TO_MANY_ROWS: utilsez des Curseur ou bien des TYPES Tables
No comments:
Post a Comment