我需要知道在Oracle上定期运行查询的最佳做法是什么(我使用 11g )。
在我的特定用例中,我在表DUE_DATE
中指定了x
。我想要做的是每天00:01运行一个查询来计算某些记录的状态(OK,Warn,Critical或Overdue)。特定记录的状态是从今天的日期(其中'今天'是查询运行的那天)相对于x.DUE_DATE
以及一些用户指定的值表示'警告'和'关键'(包含在表y
)中。
today < x.DUE_DATE - y.WARN
today >= x.DUE_DATE - y.WARN and today < x.DUE_DATE - y.CRITICAL
today >= x.DUE_DATE - y.CRITICAL and today <= x.DUE_DATE
today > x.DUE_DATE
定期运行此查询的最佳方法是什么?我找到了以下选项,但不确定哪个最适合我的用例:
我知道我可以根据每个用户请求动态计算状态,但由于停顿只会每天更改一次,我认为进行计算会更有效,并且每天也会缓存一次后续结果。
非常感谢提前。
答案 0 :(得分:9)
例如,您可以安排作业执行以下更新:
update x
set status = (CASE
WHEN sysdate < x.DUE_DATE - y.WARN THEN
'Ok'
WHEN sysdate >= x.DUE_DATE - y.WARN and today < x.DUE_DATE - y.CRITICAL THEN
'Warn'
WHEN sysdate >= x.DUE_DATE - y.CRITICAL and sysdate <= x.DUE_DATE THEN
'Critical'
WHEN sysdate > x.DUE_DATE THEN
'Overdue'
END)
;
要创建每天00:00安排的作业:
BEGIN
dbms_scheduler.create_job(job_name => 'Status Updater',
job_type => 'PLSQL_BLOCK',
job_action => '
BEGIN
update x
set status = (CASE
WHEN sysdate < x.DUE_DATE - y.WARN THEN
''Ok''
WHEN sysdate >= x.DUE_DATE - y.WARN and today < x.DUE_DATE - y.CRITICAL THEN
''Warn''
WHEN sysdate >= x.DUE_DATE - y.CRITICAL and sysdate <= x.DUE_DATE THEN
''Critical''
WHEN sysdate > x.DUE_DATE THEN
''Overdue''
END)
;
END;',
start_date => systimestamp,
repeat_interval => 'FREQ=DAILY;INTERVAL=1;BYHOUR=0;BYMINUTE=0;',
enabled => TRUE);
END;
/
答案 1 :(得分:2)
你的问题的答案:在Oracle中调度程序的最佳方法是什么:dbms_scheduler。
在您的特定用例中:为什么要这样做?现在,您计划每天为您的数据执行此操作,也可以在没有人感兴趣时执行此操作。最后,您的状态是一个过程变量,根据sysdate和其他数据项计算。