Friday 3 June 2011

Oracle PL/SQL NO_DATA_FOUND et TOO_MANY_ROWS EXCEPTIONS.

ORACLE ERROR

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.

 

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;
/

DECLARE
*

ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 6

Traitement de l'erreur :Introduire la clause EXCEPTION
 

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

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;
/

DECLARE
*

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 EXCEPTION
 

SQL> 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