1

Oracleで定期的にクエリを実行することに関するベストプラクティスを知る必要があります(私は11gを使用しています)。

私の特定のユースケースではDUE_DATE、テーブルで指定されていますx。私がやりたいのは、毎日00:01にクエリを実行して、いくつかのレコードのステータス(OK、警告、クリティカル、または期限切れ)を計算することです。特定のレコードのステータスは、今日の日付(「today」はクエリが実行されている日)x.DUE_DATEと、「warn」および「critical」(テーブルに含まれるy)を意味するユーザー指定の値から計算されます。

  • OK->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

このクエリを定期的に実行する最良の方法は何ですか?次のオプションを見つけましたが、どちらが私のユースケースに最適かわかりません。

ユーザーのリクエストごとに動的にステータスを計算できることは知っていますが、stausesは1日1回しか変更されないため、計算を実行して後続の結果を1日1回キャッシュする方が効率的だと思いました。

よろしくお願いします。

4

2 に答える 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;
/
  • レポートを作成する必要がある場合は、レポートツールでレポートをスケジュールするか、マテリアライズドビューを使用して結果セットを保存します。
于 2012-08-31T11:01:24.413 に答える
2

あなたの質問への答え:Oracleでスケジューラーを作成するための最良の方法は絶対に:dbms_schedulerです。

特定のユースケースでは、なぜこれを行うのですか?今、あなたはあなたのデータのためにこれを毎日行うことを計画しています、そして誰も興味がないときも。結局、あなたのステータスは、sysdateと他のデータ項目から計算されたプロセス変数です。

于 2012-08-31T11:02:14.083 に答える