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.
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.
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
vgKmwJ Excellent article, I will take note. Many thanks for the story!
Excelente artigo Gerson! Li os dois e consegui esclarecer todas as dúvidas. Muito obrigado!
Olá … um job é executado a primeira vez assim que é criado?
Tem como eu determinar que a primeira vez será a 00:00?
Obrigada,
Simone
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.
Gerson,
Os dois artigos são excelentes. Parabens.