kundb使用DBMS_UTILITY.FORMAT_ERROR_BACKTRACE记录报错行号

  其他常见问题
内容纲要

概要描述


DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 是 Kundb 提供的一个内置函数,用于获取异常发生时的完整调用堆栈回溯信息。它返回一个格式化的字符串,精确指出哪一行代码抛出了异常——这是 SQLERRMSQLCODE 无法提供的。

详细介绍


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 行

排查多层嵌套代码非常高效。

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。