2015-09-14 2 views
5

В настоящее время я работаю над ошибками регистрации в процедуре. Цель этой процедуры заключается в вызове обработчиков исключений в других пакетах в БД и регистрации ошибок, с которыми сталкивается каждая программа. ниже мой код.номер строки журнала в оракуле

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; 
/

В настоящее время я просто вызывая ошибку в моем mock_data таблицы регистрировать ошибку в таблице error_log и посмотреть, если его функциональный я просто не могу понять, как войти в столбец с номером строки. Я полный новичок, поэтому любая помощь будет оценена. Если кто-нибудь знает, как я мог бы использовать эту процедуру в других пакетах/процедурах для регистрации ошибок в других пакетах, которые также были бы удивительными. Я здесь, чтобы узнать, что любая обратная связь приветствуется, я могу еще больше расширить этот пост, если я не буду ясно.

+0

Я использую этот пакет от Steven Feurstein. По-видимому, он недоступен у Жабы больше, но можно найти здесь http://awads.net/wp/2007/08/08/new-oracle-plsql-error-management-framework-released/ Зачем писать его, когда вы можете использовать установленный пакет? – kevinsky

+0

Спасибо за ресурсы, к сожалению, я использую Toad, и мой начальник хотел бы, чтобы я изучил и написал процедуру для других программ для запуска в своем обработчике исключений. – Jules

ответ

2

Попробуйте использовать DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. Вы можете посмотреть here для получения дополнительной информации.

Что-то, как это должно сделать работает код:

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

Я пробовал писать, что в разделе значений, а также обработчик исключений ... продолжал получать ошибки. Хотя я сделаю еще немного чтения. Возможно, я просто использую его неправильно. – Jules

+0

играл с этой утилитой, потрясающе, спасибо. – Jules

+0

Добро пожаловать. Рад помочь. :) – Aramillo

1

Используйте следующую, чтобы получить стек вызовов:

  • dbms_utility.format_error_stack
  • dbms_utility.format_error_backtrace

Например,

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 
Смежные вопросы