2012-05-08 4 views
0

У меня есть таблица по имени AN_REMEDIATION_MATRIX, загруженная через пакет plsql.Чтобы загрузить таблицу журналов с датой начала, датой окончания и обработкой пакета в oracle

У меня есть таблицы журнала 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 

Теперь мне нужно, чтобы загрузить эту таблицу журнала с указанными выше значениями, когда мой пакет выполняются.
Как это можно сделать? кто-нибудь может помочь мне, я не знаю, как это работает, поскольку я новичок в оракуле.

Ждем ответа.

Спасибо

+1

Добавление строк в таблицу выполняется с помощью команды 'INSERT'. В чем именно ваш вопрос. –

+0

@Deepthi: как указано в 'a_horse_with_no_name', вы можете вставить в' MD_RUNS_STEP' после загрузки вашего AN_REMEDIATION_MATRIX'.Or, если вы хотите регистрировать после каждой вставки, а затем использовать триггер в этой таблице. –

ответ

1

вам необходимо выполнить периодические вставки в эту таблицу в качестве пакета выполняется, и нужна возможность увидеть прогресс от другого сеанса делать?

Если да, вы можете посмотреть заявление PRAGMA AUTONOMOUS_TRANSACTION. Поместите инструкцию insert в функцию, определенную с помощью этой PRAGMA, и вы можете зафиксировать свою вставку независимо от вашего пакета. Вызовите свою функцию по мере необходимости в своем пакете.

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. Спросите или посмотрите на текущую нагрузку.

+0

+1 для полного рецепта. – DCookie