2012-08-31 8 views
1

오라클에 대한 쿼리 실행과 관련하여 가장 좋은 방법은 무엇입니까 (11g).주기적으로 Oracle 쿼리를 실행하는 가장 좋은 방법

내 특정 사용 예로 나는 을 테이블 x에 지정했습니다. 내가하고 싶은 일은 매일 00:01에 쿼리를 실행하여 일부 레코드의 상태 (OK, Warn, Critical 또는 Delay)를 계산하는 것입니다. 특정 레코드의 상태는 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는 하루에 한 번만 변경되므로 계산을 수행하고 이후 결과를 하루에 한 번 캐시하는 것이 더 효율적이라고 생각했습니다.

미리 감사드립니다.

답변

9
  • 실행중인 작업 (및 쿼리)의 경우 DBMS_SCHEDULER은 선택할 도구입니다. 따라서 의 쿼리 결과에 따라 테이블의 상태를 업데이트하려면 DBMS_SCHEDULER을 사용하십시오. 당신이 에 필요한 경우

    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; 
    /
    
    • :

      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 매일 예약 된 작업을 만들려면 : 당신이 다음 업데이트를하고 작업을 예약 할 수 예를 들어

    보고서을 준비하고보고 도구에서 보고서를 예약하거나 Materialized View을 사용하여 결과 집합을 저장하십시오.

+0

답변과 특히 유용한 예제에 감사드립니다. – jabclab

+0

이름을 'Status_Updater'로 변경해야했습니다. Oracle은 공백이있는 이름을 선호하지 않습니다. –

2

질문에 대한 답변 : 오라클에서 가장 좋은 방법은 무엇입니까 : dbms_scheduler.

구체적인 사용 사례 : 왜이 ​​기능을 사용해야합니까? 이제 아무도 관심이 없을 때도 데이터를 위해 매일이 작업을 수행 할 계획입니다. 결국 상태는 proces 변수이며 sysdate 및 다른 데이터 항목에서 계산됩니다.

관련 문제