2015-03-27 4 views
0

Я выполняю экстракцию данных для своих процедур каждые 1 час. Я хочу отслеживать сообщение об ошибке ошибки для выполнения процедуры во время этого извлечения, чтобы я мог проверить мои файлы журналов и исправить их. Я пишу вышеуказанный код для отслеживания сообщения об ошибке для одной из процедур i.e EXT_10035_WS_ACTMAN, но не работал. У меня есть ошибка в этой процедуре т.е. Unique constratint нарушена, однако он не был прочитан DBMS.OUTPUT.PUT_LINEКак отслеживать сообщение об ошибке exeception во время выполнения процедуры

BEGIN 
DBMS_OUTPUT.PUT_LINE('START EXT_10035_WS_ACTMAN '||TO_CHAR(CURRENT_TIMESTAMP)); 
DATA_CAPTURING.EXT_10035_WS_ACTMAN; 
COMMIT; 
DBMS_OUTPUT.PUT_LINE('STOP EXT_10035_WS_ACTMAN '||TO_CHAR(CURRENT_TIMESTAMP)); 
EXCEPTION WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('EXCEPTION START EXT_10035_WS_ACTMAN '||TO_CHAR(CURRENT_TIMESTAMP)); 
DBMS_OUTPUT.PUT_LINE ('EXCEPTION' || SQLERRM); 
DBMS_OUTPUT.PUT_LINE ('ERROR CODE' || SQLCODE); 
END; 
+0

Это код производства? Если это так, не используйте 'dbms_output.put_line'; это то, что нужно использовать только для специальных вещей, а не для производственного кода! Вместо этого, если вы хотите сохранить журнал своих прогонов, вы должны создать таблицу журналов, а затем вставить в нее. В идеале ваша процедура 'data_capturing.ext_100.5_ws_actman' также имеет вызовы для входа в ту же таблицу, чтобы вы могли отслеживать, что происходит во время процедуры. – Boneist

ответ

2

Общепринятым способом является использование независимой от транзакций регистрации посредством автономных транзакций. Проверьте что-то вроде этого:

create table Log(id integer not null primary key, 
       dt timestamp not null default systimestamp, 
       place varchar2(100 char), 
       message varchar2(2000 char)); 

create sequence Log_Seq; 

create or replace procedure Write(p_Place varchar2, p_Message varchar2) is 
    pragma autonomous_transaction; 
begin 
    insert into Log (id, place, message) 
    values (Log_Seq.nextal, p_Place, p_Message); 
    commit; 
exception 
    when others then 
    rollback; 
    raise; 
end; 

create or replace procedure EXT_10035_WS_ACTMAN is 
begin 
    Write('EXT_10035_WS_ACTMAN', 'Start'); 
    .... 
    commit; 
    Write('EXT_10035_WS_ACTMAN', 'Finish'); 
exception 
    when others then 
    Write('EXT_10035_WS_ACTMAN', sqlerrm); 
    rollback; 
    raise; 
end; 
+0

Привет, я очень новичок в обработке исключений. У меня есть много данных, извлекаемых из процедуры, поэтому я не могу вставить их в новую таблицу или не могу использовать непосредственно в моей процедуре, иначе это замедлит работу моей процедуры. Я создал новую процедуру, называемую RUN_EXTRACTION, и я вызываю другие процедуры внутри этой процедуры. Код, о котором я упомянул, относится к процедуре RUN_EXTRACTION, где я вызываю процедуру DATA_CAPTURING.EXT_10035_WS_ACTMAN. Поэтому я хочу использовать обработку исключений в этом коде – Andrew

+0

Мне любопытно, почему вы думаете, что запись в файл будет влиять на вашу производительность хуже, чем писать в таблицу. Тем не менее, если вы настаиваете на использовании DBMS_OUTPUT, убедитесь, что у вас есть первый SET SERVEROUPUT ON в вашем скрипте, чтобы вывести выходные данные и что ваш сценарий буферизует вывод в файл журнала, если он вызывается SQL * Plus. Поскольку dbms_output только записывает на консоль во время выполнения, поэтому вам нужно получить это в файл, чтобы вы могли его прочитать. –

+0

ваше предложение отлично работает для меня. Я избегал решения прямого написания исключений в процедурах, потому что у меня есть 50 процедур. Я использовал SET SERVEROUTPUT ON, а затем использовал обработку exeception и, похоже, правильно заблуждался. – Andrew

1

Вы лучше писать пакет обработчик ошибок/процедуры, и вызвать его, когда у вас есть исключение. С помощью процедуры ошибки выпишите любую связанную информацию (имя процедуры, в которой произошло исключение, код ошибки, вызывающий пользователь и любые связанные данные) в таблицу ошибок или в файл.

Смежные вопросы