Oracle PL/SQL: как получить трассировку стека, имя пакета и имя процедуры
Иногда исключение возвращает что-то вроде: "ORA-06502: PL/SQL: числовая или значение:
символьный строковый буфер слишком мал ".
Это не так читаемо, поскольку он не сообщает ни о таблице, ни столбце, ни о значении, которое он пытался записать.
было бы полезно получить текущее имя процедуры в момент, когда Исключение произошло или уловлено.
Как я могу это получить?
Ответы
Ответ 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.
Ответ 2
Или попробуйте DBMS_UTILITY.FORMAT_CALL_STACK
Ответ 3
Или вы можете использовать DBMS_DEBUG.PRINT_BACKTRACE
Ответ 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