JOB no ORACLE – Definindo a periodicidade. (INTERVAL)

Fala PessoALL,

Bom, atendendo à dica do amigo Alessandro Varela (http://blogdovarela.com.br) hoje falarei sobre: Como definir corretamente a periodicidade da execução dos seus Job’s! Complica não? É nada!! Vamos lá!

Espero que todos tenham lido o post que fiz falando sobre Job’s, caso não tenha lido, ainda dá tempo, basta ler o post Jobs no Oracle.

Bom, quando fazemos a criação de um Job, é porque temos a necessidade que uma determinada tarefa seja executada de tempos em tempos, e para isso geralmente precisamos definir um intervalo para que o Job seja executado novamente. Por exemplo: Quero que meu Job rode a cada hora, quero que meu Job rode todo dia de 23:00, quero que meu job rode a cada 5 minutos, e assim por diante. Só que no momento de fazer esta parametrização é quando começa a confusão, pois, as pessoas esquecem de que o Job vai rodar sozinho e ele é quem tem que definir a próxma execução! Para simplificar isso, vamos lá!

Todo mundo lembra no post anterior que eu falei que para criar um Job usamos a package DBMS_JOB e a procedure DBMS_JOB.SUBMIT(...), certo? Pois é, nesta procedure, um dos parâmetros que é passado é um tal de INTERVAL, ou seja, o intervalo entre cada execução do seu Job. É aqui que mora o X (xis) da questão! É neste parametro que vamos informar de quanto em quando tempo nosso Job vai rodar.

O que tem que ser considerado aqui, é que o Job será executado automaticamente (essa é a razão do seu existir) e é justamente por isso que rola a confusão, quando este parâmetro for usado já não estaremos mais na data “agora”, estaremos na data de execução do Job, sei lá, 23:00! E aí o banco vai usar este parâmetro INTERVAL para setar o campo NEXT_DATE, que é a próxima data em que o Job será executado, ou seja você tem que levar em consideração que o banco sempre vai usar sysdate para calcular este valor.

Como é de rotina, vamos para os exemplos que tudo vai ficar mais claro.
Exemplos mais comuns:

Job para rodar de hora em hora:
Interval -> ‘sysdate + 1/24’
Ou seja, se este Job rodar dia 25/10/2009 às 14:00, quando for somada 1 hora, teremos 15:00 como NEXT_DATE.

Job para rodar a cada 5 minutos.
Interval -> ‘sysdate + 5/1440’
Ou seja, se este Job rodar dia 25/10/2009 às 14:00, quando for somado 5 minutos (1/1440), teremos 14:05 como NEXT_DATE.

Job para rodar uma vez por mês:
Interval -> ‘add_months(sysdate, 1)’
Ou seja, se executar dia 25/10/2009, aplicando este valor acima, teriamos 25/11/2009 como NEXT_DATE.

Esse foi um dos casos mais estranhos, pedido através do blog pra mim…
Job para rodar em um dia específico a cada ano e numa determinada hora:
‘add_months(to_date(to_char(sysdate, ”DD/MM/YYYY”)||” 05:00”, ”DD/MM/YYYY HH24:MI”), 12)’
Ou seja, se o job rodar dia 25/10/2009 as 15:00, e aplicarmos esta fórmula aí, teremos 25/10/2010 05:00 como NEXT_DATE.

Uma dica legal para você fazer esta fórmula que será o NEXT_DATE do seu Job é dar select em sysdate usando a dual. Que eu creio ser o que o banco faz na hora de rodar o Job.

Por exemplo:
Se executarmos o comando:
select sysdate, sysdate + 1/24 from dual
Vamos obter como retorno:

sysdate sysdate + 1/24
20/10/2009 15:55:35 20/10/2009 16:55:35

Isso aí nos dá a hora atual e a hora atual somado 1 hora. Assim você monta seu NEXT_DATE facilmente!

É isso pessoal, espero que tenha ficado claro e que daqui pra frente seja mais fácil montar seus Jobs para as mais diversas necesidades.

Qualquer coisa, estamos por aqui!

Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com

9 ideias sobre “JOB no ORACLE – Definindo a periodicidade. (INTERVAL)

  1. Vitor

    Olá, desculpa a pergunta de iniciante, mas eu tenho como saber, por meio de comando, qual o horário que um job terminou a execução?
    Obrigado.

    Responder
    1. oracle Autor do post

      Tem sim, mas você tem como saber apenas a última execução.

      Basta você dar um select na tabela dba_jobs (conectado com um usuário DBA) ou user_jobs (conectado com o usuário dono do job) e verificar as colunas last_date e last_sec, elas mostram a ultima data e ultima hora de execução do Job.

      Exemplo:
      select job, last_date, last_sec from dba_jobs

      Aí, claro, você tem que identificar qual dos job´s é o que você está verificando, você pode ver isso pela coluna what que é o que guarda o que o job executa.

      Espero que te ajude.

      Atc.
      Gerson Júnior
      gerson.vasconcelos@gmail.com

      Responder
  2. Simone

    Olá … um job é executado a primeira vez assim que é criado?
    Tem como eu determinar que a primeira vez será a 00:00?

    Obrigada,

    Simone

    Responder
    1. oracle Autor do post

      Simone,

      Antes de tudo, obrigado pela visita.

      Bom, quando você cria um job voce especifica a data em que ele vai rodar. Se você analisar a criaçao, tem um parametro chamado Next_Date, isso indica a próxima vez que o job vai rodar. Quando voce está criando o job, voce pode colocar a data que desejar nele, depois da primeira execução, ele vai pegar a hora do termino da execução e usar o parametro INTERVAL para definir quando será a próxima execução.

      Espero ter sido claro!

      Grato.

      Responder
  3. Adriano

    Gerson,

    Parabéns pelos artigos.

    Aproveitando o tema, tenho um problema com o Job(Next_date), executo o job atraves do comando dbms_job.rum(Nº Job) ele executa com sucesso, mas não programa o Next_date, desta forma não é executado novamente, saberia me dizer o que pode estar errado ?

    Grato,
    Adriano.

    Responder
  4. Maikew

    Trabalho com o Oracle e venho infrentando um problema com Job’s, pois o horário de execução do job esta andando (coisa de segundos), ja tentei colocar o INTERVAL desta forma: trunc(sysdate +1) + 22/24 para rodar exatamente as 22hrs, porém o horário continua andando. Saberia me dizer como faço para fixar o horário do JOB em exatamente 22:00:00 hrs, pois a empresa necessita que ele seja executado exatamente neste horário!
    Obrigado.

    Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *