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

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

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

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

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

Ответы [ 4 ]

36 голосов
/ 12 августа 2011

Вы, вероятно, хотите 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.
9 голосов
/ 27 октября 2014

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

7 голосов
/ 12 августа 2011

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

6 голосов
/ 16 сентября 2016

Я использую комбинацию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...