CRIANDO E ALTERANDO JOBS NO ORACLE

Algumas tarefas ou execuções de processos precisam ser feitas periodicamente, ou simplesmente agendadas para um determinado horário.
O Oracle possui algumas maneiras de automatizar estas atividades, uma delas é a submissão de atividades como JOBS.

JOBs são objetos associados ao schema que permitem agendamento de atividades, para trabalharmos com os jobs precisamos de permissão de execução na package DBMS_JOB.
( é válido lembrar que deve existir uma queue para os jobs previamente configurada, o que é normal numa instalação padrão ).

Neste post estarei mostrando, de maneira resumida, como criar JOBS e corrigí-los caso fiquem BROKEN.

Submetendo um JOB

Para submetermos um JOB precisamos de alguns itens:
– O que executar;
– Se periódico, qual o intervalo;

No meu caso tenho uma procedure PROC_LIMPADADOS e o intervalo de execução dela é a cada 12h.

Para submetermos um JOB usamos a seguinte sintaxe:

SQLPLUS>

DECLARE
  jobno NUMBER;
BEGIN
DBMS_JOB.submit(jobno,'PROC_LIMPADADOS;',sysdate+1/12);
end;
/

Explicando os parâmetros

DBMS_JOB.submit

1) o primeiro parametro é um parametro OUT e não pode receber nenhum valor. Este campo retornará o código da sua JOB, no meu caso não exibe na tela. ( voce poderia usar o DBMS_OUTPUT.PUT_LINE ou algo assim para fazre isso 🙂 ).
2) o segundo parametro é uma string com o nome da sua procedure. Se for uma package use a seguinte forma: ‘PACKAGE_SUA.PROCEDURE_DA_PACKAGE’.
3) intervalo de execução.

Corrigindo JOBs Broken

Algumas vezes sua job pode falhar e o Oracle pode setá-la como broken. Broken é um estado que a JOB fica agendada para uma data inválida e é necessário revalidá-la para que volte a funcionar.

Para corrigirmos uma JOB BROKEN usamos o comando:

SQLPLUS>

exec dbms_job.broken(14242, FALSE,  TO_DATE('26/01/2011 05:00','dd/MM/yyyy HH24:mi') );

Explicando os parâmetros

DBMS_JOB.submit

1) o primeiro parametro é o código da sua JOB, no meu caso 14242.
2) o segundo parametro é um boleano que informa se sua JOB deve continuar BROKEN ou se deve ser reativada para execução.
3) próxima data de execução. ( ele vai manter o mesmo intervalo de anteriormente )

Como ver as JOBs

Ahá! Pois bem, para visualizarmos as JOBs cadastradas no banco devemos usar as VIEWs USER_JOBS, ALL_JOBS ou DBA_JOBS

SQLPLUS>

select * from all_jobs;

Na view você poderá ver a última execução, a próxima execução, se a JOB está broken e demais dados.

Como ver as JOBs em execução

Na view DBA_JOBS_RUNNING você terá uma listagem das JOBs em execução no momento.

SQLPLUS>

select * from dba_jobs_running;

Onde encontrar erros da minha JOB?

Você poderá encontrar erros de sua job nos alert logs e nos traces do oracle. Na pasta diag ou na pasta bdump.

Como remover uma JOB?

Edição…
Realmente acabei esquecendo de falar como remover uma JOB.
Bem, para removê-la, identifique o código dela vindo da tabela DBA_JOBS e execute o seguinte comando:

exec DBMS_JOB.remove( [numero da job] );

Espero que este post possa ajudar na criação e manutenção das JOBS.
Abraço!

10 comentários sobre “CRIANDO E ALTERANDO JOBS NO ORACLE”

    1. Buenas Frederico!

      Podes usar a DBMS_JOB.CHANGE para esta função, veja exemplo:

      set pagesize 5;
      col what format a50;
      select job,what from dba_jobs;
      SQL>
      JOB WHAT
      ———- ————————————————–
      1 PROC_LIMPADADOS2;

      SQL> exec DBMS_JOB.CHANGE( job=>1, what=> ‘PROC_LIMPADADOS;’,next_date=>sysdate+1,interval=>’sysdate+1/12′);

      select job,what from dba_jobs;
      PL/SQL procedure successfully completed.

      SQL>
      JOB WHAT
      ———- ————————————————–
      1 PROC_LIMPADADOS;

      Abraço!

  1. Dartanghan,

    Ótimo post, mas…

    E se meu job não for periódico, ou seja, se ele rodar sob demanda?
    Neste caso, como faço para disparar um job já criado?

    Obrigado desde já!

    1. Buenas João!

      Bem, se seu job rodar sob demanda ( apesar de eu não entender bem a necessidade / contexto ) pode ser trabalhado usando DBMS_JOB.BROKEN ( Código da JOB,TRUE | FALSE ) . Onde você poderá passar o código de sua job e true para desativar a Job e o código de sua Job com False para habilitá-la e já executar. Mas sinceramente acredito que uma simples procedure para esta atividade seria o suficiente. Ou um If dentro da procedure da Job, para evitar intervenções.

      Abraço!

  2. Muito obrigado, Ajudou muito….
    procurei procurei, achei um monte todo complicado e nao funcionava…
    o seu ficou perfeito.
    Obrigado por compartilhar

Deixe uma resposta