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