2011-08-11 10 views
19

Czasami wyjątek zwraca coś w rodzaju: "ORA-06502: PL/SQL: błąd numeryczny lub wartość: zbyt mały bufor ciągu znaków".Oracle PL/SQL: jak uzyskać ślad stosu, nazwę pakietu i nazwę procedury

Nie jest tak czytelny, ponieważ nie zgłasza ani tabeli, kolumny ani wartości, którą próbował zapisać.

byłoby przydatne, aby uzyskać nazwę aktualnej procedury w momencie wystąpienia wyjątku lub jest catched.

Jak mogę to uzyskać?

Odpowiedz

31

Prawdopodobnie chcesz DBMS_UTILITY.FORMAT_ERROR_BACKTRACE funkcję

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. 
3

używam kombinacji DBMS_UTILITY.FORMAT_ERROR_STACK i DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. (Poprawa odpowiedź Justin Cave)

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

To daje błąd na pierwszej linii i stos na następujących liniach: (wyjście z przykładu podanego przez 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 
+0

lepsze wykorzystanie DBMS_OUTPUT .PUT, ponieważ stos/śledzenie błędów zawiera już nowy znak linii. – lav