web-dev-qa-db-fra.com

Oracle PL / SQL: comment obtenir la trace de la pile, le nom du package et le nom de la procédure

Parfois, l'exception renvoie quelque chose comme: "ORA-06502: PL/SQL: erreur numérique ou de valeur: tampon de chaîne de caractères trop petit".

Ce n'est pas si lisible car il ne rapporte ni la table, la colonne et la valeur qu'il a essayé d'écrire.

il serait utile d'obtenir le nom de la procédure actuelle au moment où l'exception s'est produite ou est interceptée.

Comment puis-je l'obtenir?

24
Revious

Vous voulez probablement DBMS_UTILITY.FORMAT_ERROR_BACKTRACE fonction

SQL> ed
Wrote file afiedt.buf

  1  create or replace procedure p1
  2  is
  3  begin
  4    raise_application_error( -20001, 'Error 1', true );
  5* end;
SQL> /

Procedure created.

SQL> create or replace procedure p2
  2  as
  3  begin
  4    null;
  5    p1;
  6  end;
  7  /

Procedure created.

SQL> begin
  2    p2;
  3  exception
  4    when others then
  5      dbms_output.put_line( dbms_utility.format_error_backtrace );
  6  end;
  7  /
ORA-06512: at "SCOTT.P1", line 4
ORA-06512: at "SCOTT.P2", line 5
ORA-06512: at
line 2


PL/SQL procedure successfully completed.
38
Justin Cave
9
xmedeko

J'utilise la combinaison de DBMS_UTILITY.FORMAT_ERROR_STACK et DBMS_UTILITY.FORMAT_ERROR_BACKTRACE . (Amélioration de la réponse de Justin Cave)

when others then
  Dbms_Output.put_line ( DBMS_UTILITY.FORMAT_ERROR_STACK() );
  Dbms_Output.put_line ( DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() );

Cela donne l'erreur sur la première ligne et la pile sur les lignes suivantes: (sortie de l'exemple donné par Justin Cave)

ORA-20001: Error 1
ORA-06512: at "SCOTT.X1", line 4
ORA-06512: at "SCOTT.X2", line 5
ORA-06512: at line 2
8
rvheddeg

Ou vous pouvez utiliser DBMS_DEBUG.PRINT_BACKTRACE

7
mamboking