pl/sql调试程序
对于许多PL / SQL开发人员来说,这可能是常识,但是对于我们的一位客户来说,这是未知的PL / SQL功能:回溯。
当您的应用程序在调用堆栈的某个深处引发错误时,您不会立即获得有关错误确切来源的信息。 对于大型PL / SQL应用程序,这可能会很麻烦。 一种解决方法是跟踪发生任何错误之前最后执行的语句号:
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-debugging ,这对Java开发人员来说并不为人所知!
但是在PL / SQL中也不需要println调试。 请改用DBMS_UTILITY.FORMAT_ERROR_BACKTRACE函数! 一个例子:
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块生成以下输出:
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
您可以确切地看到哪个行号产生了错误。 如果您没有在匿名块中使用本地过程(很有可能不是),这将变得更加有用:
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;
/
现在上面的输出:
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软件包的更多信息,请考虑使用手册 。 真正被称为“ UTILITY”的所有事物的本质,它实际上包含了很多您在这里不会期望的随机事物!
翻译自: https://www.javacodegeeks.com/2014/09/plsql-backtraces-for-debugging.html
pl/sql调试程序