gpt4 book ai didi

oracle - 如何从 RAISED 异常中获取 oracle PL/SQL 中原始异常的堆栈跟踪?

转载 作者:行者123 更新时间:2023-12-04 15:08:24 24 4
gpt4 key购买 nike

我遇到了一个问题,即当我捕获异常然后引发异常时,原始堆栈跟踪丢失。

  • proc_a 中抛出异常
  • 捕捉异常。
  • 执行回滚。
  • 提出异常(exception)。
  • 捕获异常(父块)
  • 打印堆栈跟踪:SUBSTR(SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3999)

  • 例子:
    DECLARE
    BEGIN
    DECLARE
    lv_val VARCHAR2(1);
    BEGIN
    SELECT dummy INTO lv_val -- Line# 6 (desired)
    FROM dual
    WHERE dummy = 'FFF';
    EXCEPTION
    WHEN OTHERS THEN
    --DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3999));
    RAISE; -- Line# 12 (actual)
    END;
    EXCEPTION
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3999));
    END;
    /

    预期结果:

    原始异常的行号(步骤 1)。
    ORA-01403: no data found
    ORA-06512: at line 6

    或者
    ORA-01403: no data found
    ORA-06512: at line 12
    Caused By:
    ORA-01403: no data found
    ORA-06512: at line 6

    实际结果:

    RAISE 的行号(步骤 4)。
    ORA-01403: no data found
    ORA-06512: at line 12

    其他失败的尝试:
    SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_STACK()
    ORA-01403: no data found
    ORA-01403: no data found
    SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_CALL_STACK()
    ORA-01403: no data found
    ----- PL/SQL Call Stack -----
    object line object
    handle number name
    0xee1cbd68 18 anonymous block

    最佳答案

    在您的内部异常处理程序中,而不是使用 RAISE程序,使用 RAISE_APPLICATION_ERROR过程传递它的结果 dbms_utility.format_error_backtrace获取原始行号的函数:

    BEGIN
    DECLARE
    lv_val VARCHAR2(1);
    BEGIN
    SELECT dummy INTO lv_val -- Line# 6 (desired)
    FROM dual
    WHERE dummy = 'FFF';
    EXCEPTION
    WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001, dbms_utility.format_error_backtrace,true);
    END;
    EXCEPTION
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3999));
    END;
    /

    如果没有外部异常处理程序,您将收到以下错误报告:
    Error report -
    ORA-20001: ORA-06512: at line 5
    ORA-06512: at line 10
    ORA-01403: no data found

    使用外部异常处理程序,您将获得以下信息:
    ORA-20001: ORA-06512: at line 5
    ORA-01403: no data found
    ORA-06512: at line 10

    消息顺序略有不同,但信息仍然存在。

    关于oracle - 如何从 RAISED 异常中获取 oracle PL/SQL 中原始异常的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40894642/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com