2 Replies Latest reply on Oct 23, 2017 5:13 PM by Amin Chavarria

    Programación avanzada dbms_scheduler

    Amin Chavarria

      Cómo programar una tarea con fecha de ejecución cada 5 de mes pero si cae el día en fin de semana que se ejecute el siguiente lunes, alguna idea?

       

      Utilizando  dbms_scheduler

       

       

      saludos

        • 1. Re: Programación avanzada dbms_scheduler
          L. Fernigrini

          Una forma de hacerlo sería:

           

          1) Crear una agenda para los lunes que caen en día 6 o 7 (lo que significa que el día 5 fue domingo o sábado). Para ello, utilizar el procedimiento "CREATE_SCHEDULE":

           

          DBMS_SCHEDULER.CREATE_SCHEDULE (
             schedule_name     => 'Lunes6y7',
             start_date        => NULL,
             repeat_interval   => 'FREQ=MONTHLY; BYMONTHDAY=6,7; BYDAY=MON',
             end_date          => NULL,
             comments          => 'Se ejecuta los lunes 6 y 7 de cada mes');
          

           

          Luego, incluir esta agenda en otra agenda (la que se utilizara para correr el proceso deseado:

           

          DBMS_SCHEDULER.CREATE_SCHEDULE (
             schedule_name     => 'Dia5oLunes6y7',
             start_date        => NULL,
             repeat_interval   => 'FREQ=MONTHLY; BYMONTHDAY=5; BYDAY=MON,TUE,WED,THU,FRI;include=Lunes6y7',
             end_date          => NULL,
             comments          => 'Se ejecuta el dia 5 si es dia de semana o los lunes 6 y 7 si el dia 5 cae en sabado o domingo);
          

           

          Como las agendas son mutuamente excluyentes (no puede ejecutarse el sábado 5 y el lunes 7, ni el domingo 5 y el lunes 6) esto debería cumplir las reglas que necesitas.

          1 person found this helpful
          • 2. Re: Programación avanzada dbms_scheduler
            Amin Chavarria

            Hola Lisandro,

             

            Gracias por responder, lo resolví un poco más complicado con un case pero voy a probar tu propuesta y te digo los resultados.

             

            Repeat Interval = (case when trim(to_char(last_day(trunc(sysdate))+5 + 7/24, 'day')) in ('sábado') then (last_day(trunc(sysdate))+5 + 7/24)+2 when trim(to_char(last_day(trunc(sysdate))+5 + 7/24, 'day')) in ('domingo') then (last_day(trunc(sysdate))+5 + 7/24)+1 else last_day(trunc(sysdate))+5 + 7/24 end)

             

             

            saludos!