我有一个按名称命名的表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 自动填充此日志表的特定方法/设置。由于它特定于您的应用程序,因此一旦您了解了这些列的含义,您就可以向 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。四处询问或查看当前正在运行的负载之一。
是否需要在执行包时定期插入此表,并且需要能够查看另一个会话的进度?
如果是这样,您可以查看PRAGMA AUTONOMOUS_TRANSACTION声明。将 insert 语句放入用 PRAGMA 定义的函数中,您可以独立于包提交插入。根据需要在包中调用函数。