【问题标题】:How to track exeception error message during procedure execution如何在过程执行期间跟踪异常错误消息
【发布时间】:2015-05-31 18:07:53
【问题描述】:

我每 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;

【问题讨论】:

  • 这是生产代码吗?如果是这样,请不要使用dbms_output.put_line;那应该只用于临时的东西,而不是生产代码!相反,如果您想保留运行日志,您应该创建一个日志表,然后插入其中。理想情况下,您的data_capturing.ext_100.5_ws_actman 过程也将调用记录到同一个表,以便您可以跟踪过程中发生的情况。

标签: sql oracle error-handling exception-handling


【解决方案1】:

一般常用的方式是通过自治事务使用事务无关的日志记录。检查如下内容:

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;

【讨论】:

  • 您好,我对异常处理非常陌生。我从程序中提取了大量数据,因此我无法插入新表或无法直接使用到我的程序中,否则会降低程序的性能。我创建了一个名为 RUN_EXTRACTION 的新过程,并且在此过程中调用其他过程。我提到的代码来自我正在调用 DATA_CAPTURING.EXT_10035_WS_ACTMAN 过程的 RUN_EXTRACTION 过程。所以这就是为什么我想在该代码中使用异常处理
  • 我很好奇为什么你认为写入文件会比写入表更糟糕地影响你的性能。尽管如此,如果您坚持使用 DBMS_OUTPUT,请确保您的脚本中首先设置了 SET SERVEROUPUT ON 以便输出被捕获,并且如果您的脚本被 SQL*Plus 调用,您的脚本会将输出假脱机到日志文件中。因为 dbms_output 仅在运行时写入您的控制台,所以您必须将其放入文件中以便您可以读取它。
  • 您的建议非常适合我。我正在避免直接在程序中编写异常的解决方案,因为我有 50 个程序。我使用 SET SERVEROUTPUT ON 然后使用异常处理,它似乎可以正确捕获错误。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2019-06-18
    • 2019-12-11
    • 2022-11-22
    • 1970-01-01
    相关资源
    最近更新 更多