Для многих разработчиков 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 ErrorORA-06512: at line 3ORA-06512: at line 6ORA-06512: at line 9ORA-06512: at line 12ORA-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 ErrorORA-06512: at "PLAYGROUND.P4", line 2ORA-06512: at "PLAYGROUND.P3", line 2ORA-06512: at "PLAYGROUND.P2", line 2ORA-06512: at "PLAYGROUND.P1", line 2ORA-06512: at line 2 |
Чтобы узнать больше о пакете DBMS_UTILITY, пожалуйста, ознакомьтесь с руководством . Верный природе всех вещей, называемых «УТИЛИТЫ», он действительно содержит довольно много случайных вещей, которые вы не ожидаете там!
| Ссылка: | PL / SQL отслеживает отладку от нашего партнера по JCG Лукаса Эдера в блоге JAVA, SQL и AND JOOQ . |