2013-08-07 4 views
0

У меня есть процедура, которую я должен выполнять каждую неделю с даты развертывания в production.It должен работать в день развертывания, а затем последующих недель до даты окончания, хранится в переменной.Как выполнить процедуру каждую неделю до даты окончания в оракуле

Мне нужно включить это на уровне процедуры, а не создавать отдельный планировщик или DBMS_JOB

Пусть дата начала 11/1/2013 (день развертывания) и дата окончания 04/30/2014 мне нужно для запуска процедуры каждую неделю один раз между этим периодом, включая дату начала.

Предположим, что прогон на 28.04.2014 и на следующей неделе выпадает в МАЙ, а затем до 30.04.2014 он должен запускаться каждый день.

справка будет принята с благодарностью.

BEGIN 

     FOR I IN (SELECT typename ....)-- will give 3 output 
     LOOP 
     IF typename = 'ABC' THEN 
     -- run THE UPDATE every week FROM start date TO END 

      UPDATE TEST 
        SET TEST.A = ...., 
         TEST.b = .... 
        WHERE TEST.c IN (....) 

     ELSIF typename = 'PQR'THEN 
      UPDATE TEST1 
        SET TEST.A1 = ..., 
         TEST.b1 = ..., 
        WHERE test1.c IN (....) 
     END LOOP; 
     END;     
    -- run THE UPDATE every week FROM start date TO END 

    --Note start date and end date is different for different types. 

    --***If the week it ran is less than end date then schedule the update every day from --that week 
    --eg the last day ends at 04/30/2014, , 
--the last run happened on 04/28/2014 then update should run on 4/29,4/30 also 
+3

«Мне нужно, чтобы включить это на уровне процедуры» что это значит? Почему dbms_scheduler запрещен? (он был создан, чтобы делать то, что вы хотите, планировать задания db) – tbone

+0

У меня есть 3 блока в моей proc.with разных датах окончания, поэтому мне нужно будет создать три планировщика. Этот процесс будет вызван другой процедурой. Так что я думал реализации в процедуре, а не планировщика. –

+0

Я часто использую планировщик. Его непонятно, какова ваша ситуация, но я сомневаюсь, что вам нужны 3 отдельных задания планировщика (возможно, цепочка, но опять же, неясно). Можете ли вы опубликовать код того, что вы пытаетесь запустить? – tbone

ответ

0

Рассмотрим, что комментировал Боб Джарвис, но если вам все еще нужно, чтобы решить вашу проблему, один из возможных решений является использование dbms_lock.sleep (число_секунд); , поэтому основной псевдокод будет:

  • запустить ваши заявления DML
  • номер вычислим для секунд в неделю
  • использование dbms_lock.sleep (число_секунд); приостановить процедуру
  • повторить до конца дата равна или меньше SYSDATE.

подробной информации об этой процедуре в here

Смежные вопросы