software 定期運行Oracle查詢的最佳方法




oracle software (2)

我需要知道在Oracle上定期運行查詢的最佳實踐(我使用的是11g )。

在我的特殊用例中,我在表格x指定了一個DUE_DATE 。 我想要做的是每天在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

定期運行此查詢的最佳方式是什麼? 我已經找到了以下選項,但是不確定哪一個最適合我的用例:

我知道我可以根據每個用戶的請求動態地計算狀態,但是每天只能改變一次,我認為這樣做會更高效,並且每天也會緩存後續的結果。

提前謝謝了。


你的問題的答案:在Oracle中調度程序的最佳方法是:dbms_scheduler。

在你的具體用例中:為什麼這樣做呢? 現在你打算每天都為你的數據做這個,也沒有人對你有興趣。 最後,您的狀態是一個過程變量,從sysdate和其他數據項計算。


  • 對於運行作業(和查詢) 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;
/
  • 如果您需要準備報告 ,請在報告工具中安排報告,或使用實體化視圖來存儲結果集。




oracle11g