如何在过程执行期间跟踪异常错误消息
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;
我每 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;