定期运行 Oracle 查询的最佳方式

问题描述 投票:0回答:2

我需要知道在 Oracle 上定期运行查询的最佳实践是什么(我正在使用 11g)。

在我的特定用例中,我在表

DUE_DATE
中指定了
x
。我想做的是每天 00:01 运行一个查询来计算一些记录的状态(正常、警告、严重或过期)。特定记录的状态是根据今天的日期(其中“今天”是查询运行的日期)相对于
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

定期运行此查询的最佳方式是什么?我找到了以下选项,但不确定哪个最适合我的用例:

我知道我可以根据每个用户请求动态计算状态,但由于状态每天只更改一次,我认为每天一次进行计算并缓存后续结果会更有效。

oracle oracle11g
2个回答
9
投票
  • 对于运行作业(和查询)DBMS_SCHEDULER 是可供选择的工具。因此,如果您想根据查询结果更新表中的状态,请使用DBMS_SCHEDULER

例如,您可以安排一项作业来执行以下更新:

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;
/
  • 如果您需要准备报告,请在报告工具中安排报告或使用物化视图来存储结果集。

2
投票

您的问题的答案:Oracle 中调度程序的最佳方法是什么绝对是:dbms_scheduler。

在您的具体用例中:为什么要这样做?现在,您计划每天对您的数据执行此操作,即使在没有人感兴趣的情况下也是如此。最后,您的状态是一个流程变量,根据 sysdate 和另一个数据项计算得出。

© www.soinside.com 2019 - 2024. All rights reserved.