Campo interval do job mais elaborado

Neste artigo gostaria de demonstrar que os jobs podem ser executados em horários diversos com varias formas de interval, e o detalhe que em um unico job.

Para os que desconhecem jobs do oracle ou queiram relembrar sobre, dê uma relida no artigo do nosso Admin Leandro Lana sobre Jobs do Oracle.
Ok, agora vamos ao que interessa.

Passei uma situação de um job ter que executar todos os dias da semana, bom é muito simples pois no campo interval é simplesmente colocar por exemplo:

DECLARE
JOBNO NUMBER;
V_EXISTS NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job => JOBNO, what => 'PROCEDIMENTO;', next_date => sysdate, interval =>'trunc(SYSDATE)+ 1) + 2/24');
end;
/
commit;

Pode se notar que o valor de interval é trunc(SYSDATE)+ 1) + 2/24 que é executar hoje + 1 = amanhã as 2/24 = amanhã as 02:00am, isso quer dizer todos os dias da semana as 02:00am

Mas sempre há situações de jobs que devem ser executados em horarios pré determinados em dias diferentes, e como fazer em unico job?

No próximo exemplo o job deve ser executado de segunda a sexta as 18:10.

Exemplo:

DECLARE
JOBNO NUMBER;
V_EXISTS NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job => JOBNO, what => 'PROCEDIMENTO;' ,  next_date => trunc(SYSDATE + 1) + 18 / 24 + 10 / 1440,  interval => 'case when TO_NUMBER(TO_CHAR(SYSDATE, ''D'')) in (1,6,7) then TRUNC(next_day(sysdate, 2)) + 18 / 24 + 10 / 1440 else trunc(SYSDATE + 1) + 18 / 24 + 10 / 1440 end ');
end;
/
commit;

Neste caso nota se que o campo interval é bem mais complexo utilizando o “case when” dentro do atributo interval.

       case
         when TO_NUMBER(TO_CHAR(SYSDATE, 'D')) in (1,6,7) then
          TRUNC(next_day(sysdate, 2)) + 18 / 24 + 10 / 1440
         else
          trunc(SYSDATE + 1) + 18 / 24 + 10 / 1440
       end

O que foi feito é um controle para que o job ao encontrar os dias 1, 6 ou 7 serem executados no proximo dia no caso segunda-feira as 18:10 e caso contrario adicionar o hoje + 1 = amanhã as 18:10.

Pode ser notado que é um campo varchar e está entre apostrofos, desta forma o que tiver um apostrofo deverá conter 2 apostrofos.

Analisando o processo feito pode ser elaborado essa string em um select simples como no caso abaixo para testes da sua clausula “case when”.

SQL> select TO_NUMBER(TO_CHAR(SYSDATE, 'D')) as "DIA_SEMANA",
  2         TRUNC(next_day(sysdate, 2)) + 18 / 24 + 10 / 1440 AS "PROX SEG",
  3         case
  4           when TO_NUMBER(TO_CHAR(SYSDATE, 'D')) in (1,6,7) then
  5                TRUNC(next_day(sysdate, 2)) + 18 / 24 + 10 / 1440
  6           else
  7            trunc(SYSDATE + 1) + 18 / 24 + 10 / 1440
  8         end as "PROX EXEC"
  9    from dual
 10  ;

DIA_SEMANA PROX SEG         PROX EXEC
---------- ---------------- ----------------
         2 21/11/2011 18:10 15/11/2011 18:10

E assim notamos o que devemos tratar no campo interval do job.

Com isso podemos tratar o interval e uma unica linha para diversos pontos no tempo.

Para maiores detalhes da função next_day pode ser verificado no artigo Exemplos de como obter datas e cálculos para datas.

Dias da semana
1 – Domingo
2 – Segunda-Feira
3 – Terça-Feira
4 – Quarta-Feira
5 – Quinta-Feira
6 – Sexta-Feira
7 – Sábado

%name Campo interval do job mais elaborado

Autor: Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).