0

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

我有一个具有以下结构的日志表 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 新手,所以我不知道它是如何工作的。

期待回复。

谢谢

4

2 回答 2

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。四处询问或查看当前正在运行的负载。

于 2012-05-08T17:50:58.917 回答
1

您是否需要在执行包时定期向该表中插入数据,并且需要能够查看另一个会话的进度?

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

于 2012-05-08T17:36:38.800 回答