Comment tracer une exception depuis qu'elle est levée

Si vous vous promenez dans le code PL/SQL des autres, vous trouverez sans doute un jour quelque chose qui ressemble à ceci:

declare
X number;
begin
select rownum into x
from dba_tables
where rownum<=2;
exception when others then
raise;
end;
/

declare
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 8

Bien sur, dans le code que vous parcourrez, l’erreur n’est sans doute pas aussi flagrante. Peut-être votre clause WHEN OTHER est-elle plus utile qu’ici ? Sans doute que l’erreur est noyée dans des dizaines de lignes…

Ce qui est intéressant, c’est que la ligne qui s’affiche est la ligne de RAISE, c’est à dire la ligne 8, alors que l’erreur vient en réalité de la ligne 4, c’est à dire l’ordre SELECT. Alors comment retrouver l’erreur ? Vous pouvez positionnez errorstack pour le code ORA-1422 avec alter session, alter system ou oradebug comme dans l’exemple ci-dessous :

alter session set events='1422 trace name errorstack';

declare
X number;
begin
select rownum into x
from dba_tables
where rownum<=2;
exception when others then
raise;
end;
/

declare
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 8

alter session set events='1422 trace name errorstack off';

Vous pourrez trouver la source de l’erreur dans le répertoire utilisée pour user_dump_dest comme dans l’exemple ci-dessous:

*** 2008-11-05 01:12:29.555
----- Error Stack Dump -----
ORA-01422: exact fetch returns more than requested number of rows
----- Current SQL Statement for this session (sql_id=3nsrtpc6npcvh) -----
SELECT ROWNUM FROM DBA_TABLES WHERE ROWNUM<=2
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
object line object
handle number name
0x3b6c6e70 4 anonymous block

----- Call Stack Trace -----

Alors suis-je le seul à tomber sur des codes comme ça ?