Les exceptions SQL oracle

A l'instar de Java, Oracle lève des exceptions en cas d'incompatibilité entre la requête demandée et son résultat, par exemple :
TOO_MANY_ROWS ; NO_DATA_FOUND ; ...

Ces exceptions sont très souvent utilisées afin d'exécuter un traitement spécifique au cas rencontré ; le cas le plus courant étant la sortie de boucle lorsque l'exception NO_DATA_FOUND est levée.

decare
cardinaliteLigne varchar2(150);
begin
select 'une seule valeur en base' into cardinaliteLigne from matable;
exception
when no_data_found then cardinaliteLigne := 'aucune valeur en base';
when too_many_rows then cardinaliteLigne := 'plusieurs valeurs en base';
end;
/


Chaque erreur Oracle (ORA-XXXX) corespond à une exception ; celle-ci a parfois un alias (comme celle ci-dessus : no_data_found) parfois elle n'en n'ont pas, mais elles sont toujours identifiables par le code d'erreur ora.


Délaration d'une exception


Il est possible d'associer des exceptions aux codes ORA-* grâce à l'instruction PRAGMA EXCEPTION_INIT(NomDeLException, CodeErreur);

Exemple :
SnapshotTooOld EXCEPTION;
PRAGMA EXCEPTION_INIT(SnapshotTooOld, -01555);
begin
MA_PROC_DE_NUIT();
exception
when SnapshotTooOld then
rollback;
insert into T_LOG (moment, evt) values (systimestamp, 'Erreur du traitement de nuit ; augmenter le UNDO');
commit;
end;
/



RAISE


Il existe également la possibilité de créer soi-même des exceptions (gràce au mot clé raise) et de les gérer de la même manière :

create or replace funtion select_bonne_table(identrant number)
begin
// exemple de mise en place d'une exception par le mot clé raise
declare
varcas varchar2(50);
varretour varchar2(50);
// La table mescas référence la table à utiliser selon l'identrant
select cas into varcas from mescas where id=identrant;
// en fonction de la table, on requete col1 dans l'une ou l'autre des tables correspondant
if varcas = 'T1' then
select col1 into varretour from table1 where id=identrant;
else if varcas = 'T2' then
select col1 into varretour from table2 where id=identrant;
else
raise exception pas_de_table;
end if;
end if;
return varretour;
end;
/

set serveroutput on
// catch de l'exception créée plus haut
begin
select_bonne_table(12);
exception
when pas_de_table then dbms_output.put_line(la donnée ne correspond à aucune table de recherche);
end;
/


Le mot clé OTHERS permet également de définir pour toute exception qui n'est pas citée :

exception when NO_DATA_FOUND then null;
when OTHERS then insert into log_table ('quand', 'msg') values (systimestamp, 'Erreur inconnue A');
end;
/


Enfin, il ne faut pas oublier que chaque exception ne peut être levée que dans un bloc begin .. exception .. end. Pour pouvoir les encapsuler, il faut encapsuler ces blocs.




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories