Статьи

PL / SQL-трассировки для отладки

Для многих разработчиков PL / SQL это может быть здравым смыслом, но для одного из наших клиентов это была неизвестная функция PL / SQL: обратные трассировки.

Когда ваше приложение вызывает ошибку где-то глубоко в стеке вызовов, вы не получаете немедленной информации о точном источнике ошибки. Для больших приложений PL / SQL это может быть проблемой. Одним из обходных путей является отслеживание номеров операторов, которые выполнялись в последний раз до возникновения любой ошибки:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
DECLARE
  v_statement_no := 0;
BEGIN
  v_statement_no := 1;
  SELECT ...
 
  v_statement_no := 2;
  INSERT ...
 
  v_statement_no := 3;
  ...
EXCEPTION
  WHEN OTHERS THEN
    -- Log error message somewhere
    logger.error(module, v_statement_no, sqlerrm);
END;

Вышеприведенное выглядит очень похоже на отладку println , вещь, которая на самом деле не известна разработчикам Java!

Но println-debugging также не требуется в PL / SQL. Вместо этого используйте функцию DBMS_UTILITY.FORMAT_ERROR_BACKTRACE ! Пример:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DECLARE
  PROCEDURE p4 IS BEGIN
    raise_application_error(-20000, 'Some Error');
  END p4;
  PROCEDURE p3 IS BEGIN
    p4;
  END p3;
  PROCEDURE p2 IS BEGIN
    p3;
  END p2;
  PROCEDURE p1 IS BEGIN
    p2;
  END p1;
 
BEGIN
  p1;
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(sqlerrm);
    dbms_output.put_line(
      dbms_utility.format_error_backtrace
    );
END;
/

Приведенный выше блок PL / SQL генерирует следующий вывод:

1
2
3
4
5
6
ORA-20000: Some Error
ORA-06512: at line 3
ORA-06512: at line 6
ORA-06512: at line 9
ORA-06512: at line 12
ORA-06512: at line 16

Вы можете точно увидеть, какой номер строки породил ошибку. Если вы не используете локальные процедуры в анонимных блоках (что, скорее всего, нет), это становится еще более полезным:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE PROCEDURE p4 IS BEGIN
  raise_application_error(-20000, 'Some Error');
END p4;
/
CREATE PROCEDURE p3 IS BEGIN
  p4;
END p3;
/
CREATE PROCEDURE p2 IS BEGIN
  p3;
END p2;
/
CREATE PROCEDURE p1 IS BEGIN
  p2;
END p1;
/
 
BEGIN
  p1;
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(sqlerrm);
    dbms_output.put_line(
      dbms_utility.format_error_backtrace
    );
END;
/

Выше теперь выводит:

1
2
3
4
5
6
ORA-20000: Some Error
ORA-06512: at "PLAYGROUND.P4", line 2
ORA-06512: at "PLAYGROUND.P3", line 2
ORA-06512: at "PLAYGROUND.P2", line 2
ORA-06512: at "PLAYGROUND.P1", line 2
ORA-06512: at line 2

Чтобы узнать больше о пакете DBMS_UTILITY, пожалуйста, ознакомьтесь с руководством . Верный природе всех вещей, называемых «УТИЛИТЫ», он действительно содержит довольно много случайных вещей, которые вы не ожидаете там!

Ссылка: PL / SQL отслеживает отладку от нашего партнера по JCG Лукаса Эдера в блоге JAVA, SQL и AND JOOQ .