Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Вы, вероятно, хотите DBMS_UTILITY.FORMAT_ERROR_BACKTRACE function

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.

Ответ 4

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