Для многих разработчиков 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 . |