我有一个名为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的新手。
期待回复。
谢谢
答案 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定义的函数中,并且可以独立于包提交插入。根据需要在您的包装中调用您的功能。