在oracle中加载包含开始日期,结束日期和进程的日志表

时间:2012-05-08 14:28:20

标签: oracle logging plsql package procedure

我有一个名为AN_REMEDIATION_MATRIX的表,通过plsql包加载。

我有一个日志表MD_RUNS_STEP,结构如下:

STEP_ID       NOT NULL NUMBER        
RUN_TYPE               VARCHAR2(10)  
RUN_START              DATE          
RUN_END                DATE          
RUN_SUCCESS            NUMBER        
USERNAME               VARCHAR2(30)  
RUN_ID        NOT NULL NUMBER        
RUN_ROLLBACK           NUMBER        
STEP_ID_PREV           NUMBER        
SYSID                  VARCHAR2(9)   
PROGRESS               VARCHAR2(500) 
STAT_RECS              NUMBER        
STAT_CPU               NUMBER        
STAT_TIME              NUMBER        
STAT_SEQ_READ          NUMBER        
STAT_SCT_READ          NUMBER

现在我需要在执行我的包时加载带有上述值的日志表 如何才能做到这一点?任何人都可以请帮助我我不知道它是如何工作的,因为我是oracle的新手。

期待回复。

谢谢

2 个答案:

答案 0 :(得分:2)

没有Oracle特定方式/设置自动填充此日志表。由于它特定于您的应用程序,因此一旦您了解这些列的含义,就可以在pl / sql过程中添加代码以根据需要获取日志。有些列很简单,这通常是代码的外观。

让我们说你当前的程序当前看起来像这样..

create or replace procedure p_INS_AN_REMEDIATION_MATRIX
as
BEGIN
  insert into p_INS_AN_REMEDIATION_MATRIX(.....) values (.....);
  update p_INS_AN_REMEDIATION_MATRIX set... where ...;
  commit;
END;
/

我们来看一些日志列..(STEP_ID,RUN_START,RUN_END,RUN_SUCCESS)。 更改后,您的代码看起来像这样

create or replace procedure p_INS_AN_REMEDIATION_MATRIX
as
  procedure add_new_log (i_step_id) is
    pragma autonomous_transaction;
  begin
    insert into MD_RUNS_STEP (i_step_id, run_start) 
        values (i_step_id, sysdate);
     commit;
  end;

  procedure update_status (i_step_id, i_status) 
  .....
  end;

  v_step_id number;

BEGIN

  select run_step_id_seq.nextval into v_step_id from dual;

  add_new_log(v_step_id);

  insert into p_INS_AN_REMEDIATION_MATRIX(.....) values (.....);
  update p_INS_AN_REMEDIATION_MATRIX set... where ...;
  commit;

  update_status(i_step_id,'SUCCESS'); --will set the load finish time as well.

EXCEPTION
  WHEN OTHERS THEN
     update_status(i_step_id,'FAILURE');  
     --RAISE, SEND ERROR EMAIL Based on your logic.
END;
/

正如@DCookie指出的那样(+1),自治事务是一个完美的用例,用于这样的日志记录。您的主要交易不会受到影响,您可以随时查看最新的运行状态。

通常,您可能拥有执行所有此更新的现有软件包,您可能只需要调用这些API。四处询问或查看当前正在运行的负载。

答案 1 :(得分:1)

您是否需要在程序包执行时定期插入此表,是否需要能够查看其他会话的进度?

如果是这样,您可以查看PRAGMA AUTONOMOUS_TRANSACTION语句。将insert语句放入使用此PRAGMA定义的函数中,并且可以独立于包提交插入。根据需要在您的包装中调用您的功能。