Mardi 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
Par Daniel Roesch - Publié dans : ORACLE PLSQL
Ecrire un commentaire - Voir les 0 commentaires
Retour à l'accueil

Rechercher Articles Oracle SQL sur ce Site.

Loading

À lire aussi…

Download PDF Oracle

Rechercher sur le site

Oracle 10G - DBA -

Syndication

  • Flux RSS des articles
Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés