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

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

7 Comments »

 
  • Vitor says:

    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.

  • oracle says:

    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

  • Cialis says:

    vgKmwJ Excellent article, I will take note. Many thanks for the story!

  • Marcelo says:

    Excelente artigo Gerson! Li os dois e consegui esclarecer todas as dúvidas. Muito obrigado!

  • Simone says:

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

    Obrigada,

    Simone

  • oracle says:

    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.

  • Leonardo says:

    Gerson,

    Os dois artigos são excelentes. Parabens.

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>