如何在过程执行期间跟踪异常错误消息

时间:2015-03-27 12:04:24

标签: sql oracle error-handling exception-handling

我每1小时为我的程序执行数据提取。我想跟踪此提取过程中执行过程的异常错误消息,以便我可以检入我的日志文件并进行更正。我编写了上面的代码来跟踪其中一个过程的错误消息,即EXT_10035_WS_ACTMAN但是没有用。我在此程序中有错误,即违反了唯一的constratint但DBMS.OUTPUT.PUT_LINE

未读取
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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

最好编写错误处理程序包/过程,并在遇到异常时调用它。使用错误过程,将任何相关信息(发生异常的过程名称,错误代码,调用用户和任何相关数据)写入错误表或文件中。