内容纲要
概要描述
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 是 Kundb 提供的一个内置函数,用于获取异常发生时的完整调用堆栈回溯信息。它返回一个格式化的字符串,精确指出哪一行代码抛出了异常——这是 SQLERRM 和 SQLCODE 无法提供的。
详细介绍
1.基础单存储过程(捕获行号)
故意制造语法 / 运行时异常,捕获并打印、入库堆栈信息。
delimiter //
CREATE OR REPLACE PROCEDURE test_backtrace AS
v_num int;
BEGIN
v_num :=1;
v_num := 1/0;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('===== 错误回溯信息 =====');
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;
//
call test_backtrace
call dbms_output.enable(2000);
select * from table(dbms_output.get_lines_func(20000));
报错显示第5行出错
2.嵌套调用(多层过程,完整调用栈)
实际开发常用:A 调用 B,B 内部报错,堆栈会展示全链路调用关系 + 每一层行号。
创建异常日志表(用于落地报错信息)
CREATE TABLE proc_error_log (
id NUMBER ,
proc_name VARCHAR2(200), -- 出错过程/函数名
error_code NUMBER, -- 错误码
error_msg VARCHAR2(4000), -- 错误信息
error_stack CLOB, -- 报错行号+堆栈
create_time TIMESTAMP DEFAULT SYSTIMESTAMP
);
内层存储过程(出错点)
delimiter //
CREATE OR REPLACE PROCEDURE sp_inner
AS
BEGIN
-- 故意报错:除数为0
DECLARE
v_num NUMBER;
BEGIN
v_num := 10 / 0;
END;
END;
//
外层存储过程(调用内层 + 统一捕获异常)
delimiter //
CREATE OR REPLACE PROCEDURE sp_outer
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('开始执行外层过程');
-- 调用内层过程
sp_inner;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('=== 完整异常堆栈 ===');
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
-- 入库日志
INSERT INTO proc_error_log(proc_name, error_code, error_msg, error_stack)
VALUES(
'sp_outer',
SQLCODE,
SQLERRM,
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
);
COMMIT;
END;
//
执行
call sp_outer;
select * from proc_error_log
堆栈输出示例(完整调用链):
at "lkw.sp_inner", line 8
at "lkw.sp_outer", line 7
at anonymous block, line 1
从上到下:
- 最先报错:sp_inner 第 8 行
- 外层调用位置:sp_outer 第 7 行
排查多层嵌套代码非常高效。