詳解Oracle資料庫DBMS_UTILITY包及如何查看異常詳情

2019-11-04     波波說運維

概述

今天主要介紹一下怎麼用DBMS_UTILITY來查看異常,幫助我們平時解決Oracle的一些問題。


一、查看異常常用方法:

1、DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

說明:這是在Oracle 10g資料庫引入的,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE內置函數返回一個格式化的字符串堆棧,堆棧中的程序及其行號可以回溯到錯誤被最先拋出的那一行。

範例:ORA-06512: at "DB.TEST", line 22

2、DBMS_UTILITY.FORMAT_ERROR_STACK

說明:這是在Oracle7中引入的,DBMS_UTILITY.FORMAT_ERROR_STACK 這個內置函數和SQLERRM一樣,返回的是和當前錯誤(SQLCODE返回的值)所關聯的錯誤信息。

範例:ORA-01476: divisor is equal to zero

3、DBMS_UTILITY.FORMAT_CALL_STACK

說明:這是在Oracle7中引入的,DBMS_UTILITY.FORMAT_CALL_STACK這個內置函數返回一個格式化的字符串,它顯示了執行調用堆棧:直至此函數的調用點處的所有過程或者函數的調用順序。換句話說,這個函數回答了這個問題:「我是怎麼來到這裡的?」

範例:

----- PL/SQL Call Stack -----
object line object
handle number name
00007FFA6A87CB30 31 function LTR.TEST_PAYMENT_LOGGING
00007FFA6A7C8268 3 anonymous block

二、常用腳本

1、Displays the current call stack.

SET SERVEROUTPUT ON
DECLARE
v_stack VARCHAR2(2000);
BEGIN
v_stack := Dbms_Utility.Format_Call_Stack;
Dbms_Output.Put_Line(v_stack);
END;
/

2、Displays contents of the error stack.

SET SERVEROUTPUT ON
DECLARE
v_stack VARCHAR2(2000);
BEGIN
v_stack := Dbms_Utility.Format_Error_Stack;
Dbms_Output.Put_Line(v_stack);
END;
/


三、存儲過程範例:

create or replace procedure spTest(pId number, res out number) is
begin
/* SQL query */
commit;
res := 1;
exception
when others then
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
DBMS_OUTPUT.PUT_LINE('FORMAT_ERROR_BACKTRACE:' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
DBMS_OUTPUT.PUT_LINE('FORMAT_ERROR_STACK:' || DBMS_UTILITY.FORMAT_ERROR_STACK);
DBMS_OUTPUT.PUT_LINE('FORMAT_CALL_STACK:' || DBMS_UTILITY.FORMAT_CALL_STACK);
rollback;
res := 0;
end;

覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

文章來源: https://twgreatdaily.com/D0uLM24BMH2_cNUgcXEv.html