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

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

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

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

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

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.

или попробовать DBMS_UTILITY.FORMAT_CALL_STACK


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


Я использую комбинацию 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