我有一个message_log表,其中包含ID,严重级别,消息,日志日期&时间。
我使用以下过程在我的PL / SQL脚本中将日志消息插入日志表。
add_log(ID,'START','DEBUG','No CDR Detail to be processed', sysdate);
但是如果失败,我会看到一些消息没有被记录。记录plsql进度的逐步进度(如果需要,直到失败点)的最佳方法是什么?
create or replace procedure add_log
(stp varchar2, code varchar2, log_message varchar2, logdat date)
is
begin
insert into message_log
(SEQ,PROC_STEP,
CODE,
LOG_MESSAGE,
LOG_DATE
)
values
(log_SEQ.NEXTVAL,stp,code,log_message,logdat)
;
end;
答案 0 :(得分:2)
"如果失败,我不会看到某些消息被记录。记录plsql进度的逐步进度的最佳方法是什么(如果需要,直到失败点)。"
你的ADD_LOG()程序没有包含commit
- 大概是你依靠更广泛的事务来保存日志记录。问题是,如果更广泛的事务失败,它会回滚并带上你的日志消息。
这是自治事务编译指示的少数合法用途之一。这会创建一个独立的事务(一个嵌套的会话),因此我们可以在不影响外部事务的情况下提交。
create or replace procedure add_log (stp varchar2, code varchar2, log_message varchar2, logdat date)
is
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into message_log
(SEQ,PROC_STEP,
CODE,
LOG_MESSAGE,
LOG_DATE
)
values
(log_SEQ.NEXTVAL,stp,code,log_message,logdat)
;
COMMIT;
end;
如果对ADD_LOG()进行此更改,则无论调用事务发生什么情况,都将提交所有邮件。