Pular para o conteúdo

Job no Oracle

Job no Oracle

Fala PessoALL,

Atendendo a pedidos, hoje falaremos sobre Job’s no Oracle.
Do que se trata? Job’s são tarefas que são “scheduladas” (agendadas) no Oracle para rodar numa determinada hora que você estipula.

Como assim? Bom, vamos aos exemplos:

Suponha que você tem um sistema na sua empresa de controle de acesso, ele é quem gera os crachás para os funcionários entrarem na empresa. No sistema de RH, é onde são cadastrados os meus funcionários… e agora? Tenho que fazer os dois sistemas conversarem. Geralmente essa “conversa” é feita através de arquivos, chamados EDI (eletronic Data Interchange) e seu sistema de RH teria que gerar esses arquivos diariamente durante a noite com todas as pessoas Admitidas e Demitidas para que o sistema de crachá leia este arquivo e habilite ou desabilite o acesso do funcionário. Como fazer?

Criamos um JOB para gerar este arquivo “na calada da noite”.

Num JOB você diz as rotinas que vão ser executadas, que podem ser códigos direto com blocos de PL/SQL, ou podem ser chamadas Procedures ou Packages que executam as rotinas que você precisa.

Suponhamos mais uma vez, que neste nosso exemplo, precisamos de um JOB que chame a procedure: Pr_Gera_Arq_Mov_Funcionarios, e este JOB precisa gerar este arquivo às 22:00, porque às 23:00 o sistema de controle de acesso vai ler o arquivo gerado. Pronto… cenário montado, vamos criar o JOB.

Como criamos um JOB? Temos no banco de dados Oracle uma Package que faz todo controle e manipulação dos JOB’s no banco, o nome dela é DBMS_JOB, e é ela que vamos utilizar para criar nosso JOB. Como fazemos isso? Com blocos de PL/SQL, simples e rápido, assim:

declare
--Declare variável que recebe número do JOB.
job_num binary_integer;
begin
--Cria o JOB no banco e retorna o número dele job_num
dbms_job.submit(job_num,
'begin Pr_Gera_Arq_Mov_Funcionarios; end;',
to_date('10/06/2009, 22:00', 'dd/mm/yyyy hh24:mi'),
'sysdate + 1');
end;

Vamos explicar….

A rotina dbms_job.submit(...) exige 2 parâmetros como obrigatórios, são eles:
job, que é um parâmetro OUT, ou seja, a rotina vai retornar um valor para a variável que estiver neste local, no nosso caso é o número do JOB.

what que é uma string que diz para o banco que rotinas o JOB vai executar, note que este parâmetro é uma string e tem que conter um bloco PL/SQL, ou seja, tem que ter begin...end; e tudo mais.

Os outros dois parâmetros passados neste caso, para a rotina dbms_job.submit(...) não são obrigatórios, eles são responsáveis por dizer que data o JOB vai rodar a próxima vez (next_date) e com que intervalo vai rodar novamente (interval), não são obrigatórios porque na package dbms_job existe diversas outras procedures que manipulam os JOB’s e entre elas está dbms_job.next_date(...) e dbms_job.interval(...) (entre outras), nestas rotinas é necessário informar o número do JOB e o valor que você deseja atribuir para estes atributos.

Observe que o tempo todo falamos de “número do JOB”, é isso mesmo. No Oracle, os JOB’s são identificados por números, não tem como atribuirmos nomes aos JOB’s (nem tudo é perfeito), por isso, na rotina que cria o JOB ele exige uma variável para receber o número que foi atribuído ao JOB.

Depois do seu JOB criado, você pode fazer alterações no bloco que o JOB executa, na próxima vez que ele vai rodar, no intervalo e etc, tudo usando as procedures da package dbms_job.

Para listar os JOB’s criados no seu banco de dados, bem como ver os seus Status, ultimas execuções, Status de execução, Próxima vez que vai rodar e etc, podemos dar um select na view user_jobs. E se ainda, quisermos saber que JOB’s estão sendo executados neste exato momento, podemos dar um select na tabela dba_jobs_running, mas para esta segunda você precisa ter privilégios de DBA.

Espero ter sido claro e tomara que este post seja útil.
Qualquer dúvida não deixe de enviar um comentário ou até mesmo e-mail que descobrimos juntos as respostas.

Abraços à todos

gersonjr

gersonjr

Comentário(s) da Comunidade

  1. Avatar de Diego Lenhardt

    Existe o DBMS_SCHEDULE a partir do 10g que é mais poderoso.

    Resposta:

    Verdade Diogo, porém o blog é escrito a medida que as coisas vão ocorrendo no Dia a Dia, como o nome sugere. E até o momento ainda não foi necessário falar de Scheduled Jobs, mas sem dúvida é muito mais poderoso, muito mais simples de controlar, grava log das execuções, dos erros que ocorreram e etc.

    Breve falaremos sobre isso, sem dúvida.

    Obrigado pela participação.

Deixe um comentário

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

plugins premium WordPress