问个存储过程非正常结束的问题

[复制链接]
查看11 | 回复5 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
定义了一个JOB,每天12:10定时调用一个主存储过程处理一些任务,该存储过程中又串行地调用一个个子存储过程完成具体的任务。
遇到的问题如下:某一天主存储过程只执行了一半就没再往下执行。
详细情况是这样,主存储过程写有EXCEPTION 捕获异常,正常结束或捕获到异常都会执行一条INSERT语句向一个日志表中插入一条记录。
事后没在日志表中找到主存储过程在当天的日志记录,无论是正确结束还是异常结束的都没有。
另外,子存储过程与主存储过程类似,有相应的日志INSERT语句,所以可以看到当天的子存储过程只执行了一部分,另一部分没有日志记录的可以确认是没有执行。
还有一个特殊的地方,第二天的JOB执行时间比正常时间推迟了一个半小时。我提交JOB的语句如下:
dbsm_job.submit(v_num, 'smap_main_proc;', to_date('20071001121000', 'yyyymmddhh24miss') ,'sysdate+1');
之前没遇到过存储过程就这样就断掉的情况
请高手指点。
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
关于执行时间正常时间推迟了一个半小时,原因在于 'sysdate+1'。
比如job开始执行时是14:20分,执行完毕时间是15:25,则下次执行时间是执行完毕时的sysdate+1,也就是次日的15:25
如果你希望在每天的准确时间HH:MI执行job,可以写为:
trunc(sysdate) + 1 + hh/24 + mi/24/60
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
最初由 davidyu720 发布
[B]关于执行时间正常时间推迟了一个半小时,原因在于 'sysdate+1'。
比如job开始执行时是14:20分,执行完毕时间是15:25,则下次执行时间是执行完毕时的sysdate+1,也就是次日的15:25
如果你希望在每天的准确时间HH:MI执行job,可以写为:
trunc(sysdate) + 1 + hh/24 + mi/24/60 [/B]

谢谢
但我观察到的情况和你说的有一点出入,存储过程开始执行在12:10:00, 结束时间12:11:32,但第二天的开始时间为12:10:02
每天都有几秒的延迟,这个是可以接受的,但异常结束那天之后延迟了1个半小时,这个耐人寻味
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
最初由 ccc96317 发布
[B]
谢谢
但我观察到的情况和你说的有一点出入,存储过程开始执行在12:10:00, 结束时间12:11:32,但第二天的开始时间为12:10:02
每天都有几秒的延迟,这个是可以接受的,但异常结束那天之后延迟了1个半小时,这个耐人寻味 [/B]

sorry 的确是我记错了。
ORACLE计算下次执行时间时,是以本次job实际开始时间为sysdate来计算的。你观察到每次延迟2-3秒是很正常的。如果系统很忙,job queue任务较多,延迟就会更厉害了。
'sysdate+1'的日积月累效应会导致累计延迟逐渐增大。用 trunc(sysdate) 或 trunc(sysdate, 'hh') 可以避免这个问题。
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
照此推算,延迟了1个半小时的原因很可能是job上次执行时被延迟了1个半小时。
你看过alert.log吗?有没有记录什么错误信息?
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
这里有点问题,从日志信息表的记录来看,JOB是在正常时间(比前一天延迟了1,2秒)启动的,所以第二天没在正常时间启动很奇怪
我这就去看看ALTER。LOG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行