2011-08-11 24 views
19

Đôi khi ngoại lệ trả về một cái gì đó như: "ORA-06502: PL/SQL: lỗi số hoặc giá trị: bộ đệm chuỗi ký tự quá nhỏ".Oracle PL/SQL: cách lấy dấu vết ngăn xếp, tên gói và tên thủ tục

Không thể đọc được vì nó không báo cáo cả bảng, cột và giá trị mà nó cố gắng viết.

sẽ hữu ích khi nhận tên thủ tục hiện tại tại thời điểm ngoại lệ xảy ra hoặc bị bắt.

Làm cách nào để có được điều đó?

Trả lời

31

Bạn có thể muốn DBMS_UTILITY.FORMAT_ERROR_BACKTRACE chức năng

SQL> ed 
Wrote file afiedt.buf 

    1 create or replace procedure p1 
    2 is 
    3 begin 
    4 raise_application_error(-20001, 'Error 1', true); 
    5* end; 
SQL>/

Procedure created. 

SQL> create or replace procedure p2 
    2 as 
    3 begin 
    4 null; 
    5 p1; 
    6 end; 
    7/

Procedure created. 

SQL> begin 
    2 p2; 
    3 exception 
    4 when others then 
    5  dbms_output.put_line(dbms_utility.format_error_backtrace); 
    6 end; 
    7/
ORA-06512: at "SCOTT.P1", line 4 
ORA-06512: at "SCOTT.P2", line 5 
ORA-06512: at 
line 2 


PL/SQL procedure successfully completed. 
3

tôi sử dụng sự kết hợp của DBMS_UTILITY.FORMAT_ERROR_STACKDBMS_UTILITY.FORMAT_ERROR_BACKTRACE. (Cải thiện câu trả lời của Justin Cave)

when others then 
    Dbms_Output.put_line (DBMS_UTILITY.FORMAT_ERROR_STACK()); 
    Dbms_Output.put_line (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()); 

này cung cấp cho các lỗi trên dòng đầu tiên và ngăn xếp vào các dòng sau: (đầu ra từ ví dụ do Justin Cave)

ORA-20001: Error 1 
ORA-06512: at "SCOTT.X1", line 4 
ORA-06512: at "SCOTT.X2", line 5 
ORA-06512: at line 2 
+0

Better sử dụng DBMS_OUTPUT .PUT, khi ngăn xếp lỗi/dấu vết đã chứa ký tự dòng mới. – lav

Các vấn đề liên quan