2015-09-14 22 views
5

Tôi hiện đang làm việc về lỗi ghi nhật ký trong một quy trình. Mục tiêu của thủ tục này sẽ được gọi trong các trình xử lý ngoại lệ trong các gói khác trong DB và ghi lại các lỗi mà mỗi chương trình gặp phải. dưới đây là mã của tôi.số dòng ghi nhật ký trong oracle

CREATE OR REPLACE PROCEDURE APMS.test_procedure AS 

    procedure write_error_log (errcode number, errstr varchar2) is 
    pragma autonomous_transaction; 
    -- this procedure stays in its own new private transaction 
    begin       
      INSERT INTO error_log 
       (ora_err_tmsp, 
         ora_err_number, 
         ora_err_msg, 
         ora_err_line_no) 
      values (CURRENT_TIMESTAMP, 
        errcode, 
        errstr, 
        'line number'); 
      COMMIT; -- this commit does not interfere with the caller's transaction. 
    end write_error_log; 

BEGIN 
    INSERT INTO mockdata 
     VALUES ('data1', 'mockname', 'mockcity'); 

    exception when others then    
    write_error_log(sqlcode,sqlerrm); 
    raise; 
END test_procedure; 
/

tôi đang chỉ gây một lỗi trong bảng mock_data của tôi để ghi lại các lỗi trong bảng error_log và xem nếu chức năng tôi chỉ con số không thể của nó ra làm thế nào để đăng nhập vào cột số dòng. Tôi là người mới bắt đầu hoàn chỉnh nên mọi sự trợ giúp sẽ được đánh giá cao. Addiotionally, Nếu ai biết làm thế nào tôi sẽ có thể sử dụng thủ tục này trong các gói khác/thủ tục để đăng nhập các lỗi trong các gói khác mà sẽ là tuyệt vời là tốt. Tôi ở đây để tìm hiểu vì vậy bất kỳ phản hồi nào được đánh giá cao, tôi có thể mở rộng thêm về bài đăng này nếu tôi không rõ ràng.

+0

Tôi sử dụng gói này từ Steven Feurstein. Rõ ràng là không có sẵn từ Toad nữa nhưng có thể tìm thấy ở đây http://awads.net/wp/2007/08/08/new-oracle-plsql-error-management-framework-released/ Tại sao viết nó khi bạn có thể sử dụng gói? – kevinsky

+0

Cảm ơn các nguồn tài nguyên, thật không may, tôi đang sử dụng Toad và cấp trên của tôi muốn tôi học và viết các thủ tục cho các chương trình khác để chạy trong xử lý ngoại lệ của họ. – Jules

Trả lời

2

Thử sử dụng DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. Bạn có thể xem here để biết thêm thông tin.

Something như thế này nên làm cho việc mã của bạn:

CREATE OR REPLACE PROCEDURE APMS.test_procedure AS 

    procedure write_error_log (errcode number, errstr varchar2,errline varchar2) is 
    pragma autonomous_transaction; 
    -- this procedure stays in its own new private transaction 
    begin       
      INSERT INTO error_log 
       (ora_err_tmsp, 
         ora_err_number, 
         ora_err_msg, 
         ora_err_line_no) 
      values (CURRENT_TIMESTAMP, 
        errcode, 
        errstr, 
        errline); 
      COMMIT; -- this commit does not interfere with the caller's transaction. 
    end write_error_log; 

BEGIN 
    INSERT INTO mockdata 
     VALUES ('data1', 'mockname', 'mockcity'); 

    exception when others then    
    write_error_log(sqlcode,sqlerrm,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
    raise; 
END test_procedure; 
+0

Tôi đã cố gắng viết rằng trong phần giá trị cũng như xử lý ngoại lệ ... tiếp tục gặp lỗi. Mặc dù tôi sẽ đọc thêm một số. Có thể tôi chỉ sử dụng nó không chính xác. – Jules

+0

chơi xung quanh với tiện ích đó, tuyệt vời, Cảm ơn bạn. – Jules

+0

Bạn được chào đón. Vui mừng được giúp đỡ. :) – Aramillo

1

Sử dụng sau đây để có được các cuộc gọi stack:

  • dbms_utility.format_error_stack
  • dbms_utility.format_error_backtrace

Ví dụ:

SQL> declare 
    2 v1 integer := 1; 
    3 v2 integer := 0; 
    4 v3 integer; 
    5 procedure p1 (v1 in integer, v2 in integer, v3 out integer) is 
    6 begin 
    7  v3 := v1/v2; 
    8 end; 
    9 procedure p2 (v1 in integer, v2 in integer, v3 out integer) is 
10 begin 
11  p1 (v1, v2, v3); 
12 end; 
13 begin 
14 p2 (v1, v2, v3); 
15 exception 
16 when others then 
17  dbms_output.put_line ('---------------------'); 
18  dbms_output.put_line ('This is what you record in log table:'); 
19  dbms_output.put (dbms_utility.format_error_stack); 
20  dbms_output.put (dbms_utility.format_error_backtrace); 
21  dbms_output.put_line ('---------------------'); 
22  raise; 
23 end; 
24/
--------------------- 
This is what you record in log table: 
ORA-01476: divisor is equal to zero 
ORA-06512: at line 7 
ORA-06512: at line 11 
ORA-06512: at line 14 
--------------------- 
declare 
* 
ERROR at line 1: 
ORA-01476: divisor is equal to zero 
ORA-06512: at line 22 
Các vấn đề liên quan