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

How to track exeception error message during procedure execution

我每 1 小时对我的程序执行一次数据提取。我想在此提取过程中跟踪过程执行的异常错误消息,以便我可以检查我的日志文件并更正它。我编写了上面的代码来跟踪其中一个过程的错误消息,即 EXT_10035_WS_ACTMAN 但没有用。我在此过程中遇到错误,即违反了唯一约束,但未被 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;

您最好编写一个错误处理程序 package/procedure,并在出现异常时调用它。对于错误过程,将任何相关信息(发生异常的过程名称、错误代码、调用用户和任何相关数据)写入错误 table 或文件。

一般常用的方法是通过自治事务使用独立于事务的日志记录。检查如下内容:

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;