Lors de l'exécution d'un programme PL/SQL il est possible de traiter les erreurs via la section EXCEPTION. Grace à ce mécanisme il est assez simple de mettre en place une routine qui écrit dans une table l'erreur mais surtout la ligne de code l'ayant générée.

Il suffit ensuite au développeur d'interroger cette table pour analyser le soucis. Ce billet présente un exemple de mise en place.

Création de la table

create table trace ( lib_err varchar(200), appel varchar2(200), date_err date, programme varchar2(100), user_connect varchar2(30)) ;

Bloc déclenchant l'erreur, il s'agit ici d'une division par 0

declare
  n1 number := 2;
  n2 number := 0;
  vErr trace%rowtype;
begin
  dbms_output.put_line(n1/n2);
exception
when others then
    vErr.lib_err := substr(sqlerrm,1,200);
    vErr.appel := substr(dbms_utility.format_error_backtrace,1,200);
    vErr.date_err := sysdate;
    vErr.programme := $$PLSQL_UNIT;
    select user into vErr.user_connect from dual;
    insert into trace values(vErr.lib_err,vErr.appel, vErr.date_err,vErr.programme, vErr.user_connect);
    commit:
end;
  • La fonction sqlerrm contient le texte de l'erreur
  • La variable $$PLSQL_UNIT contient le nom du programme ( fonction, procedure, trigger,... ) ayant généré l'erreur.
  • Le plus important est dbms_utility.format_error_backtrace qui donne la ligne du programme "coupable".