Oracle PL/SQL: как получить трассировку стека, имя пакета и имя процедуры

Иногда исключение возвращает что-то вроде: «ORA-06502: PL/SQL: ошибка числа или значения: буфер символьной строки слишком мал».

Это не так читабельно, так как не сообщает ни таблицу, ни столбец, ни значение, которое оно пыталось записать.

было бы полезно получить имя текущей процедуры в момент возникновения или перехвата Исключения.

Как я могу это получить?


person Revious    schedule 11.08.2011    source источник


Ответы (4)


Вероятно, вам нужна функция DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

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.
person Justin Cave    schedule 11.08.2011

Или попробуйте DBMS_UTILITY.FORMAT_CALL_STACK

person xmedeko    schedule 27.10.2014

Я использую комбинацию DBMS_UTILITY.FORMAT_ERROR_STACK и DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. (Улучшение ответа Джастина Кейва)

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

Это дает ошибку в первой строке и стек в следующих строках: (вывод из примера, приведенного Джастином Кейвом)

ORA-20001: Error 1
ORA-06512: at "SCOTT.X1", line 4
ORA-06512: at "SCOTT.X2", line 5
ORA-06512: at line 2
person Roeland Van Heddegem    schedule 16.09.2016
comment
Лучше использовать Dbms_Output.PUT, так как стек/трассировка ошибок уже содержит символ новой строки. - person lav; 17.05.2017

Или вы можете использовать DBMS_DEBUG.PRINT_BACKTRACE

person mamboking    schedule 11.08.2011