Em um ambiente de banco de dados Oracle, o pacote DBMS_SCHEDULER é uma ferramenta poderosa para agendar e executar trabalhos, que são conjuntos de tarefas que o banco de dados realiza. Ele permite agendar uma ampla variedade de tarefas e é uma alternativa mais rica em recursos do que o DBMS_JOB mais antigo.

DBMS_SCHEDULER – Conceitos Básicos

O DBMS_SCHEDULER permite agendar trabalhos no nível do segundo, e a flexibilidade do calendário permite uma especificidade incrível. A sintaxe básica para criar um trabalho é a seguinte:

DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'nome_do_trabalho',
    job_type        => 'tipo_do_trabalho',
    job_action      => 'ação_do_trabalho',
    start_date      => data_de_início,
    repeat_interval => 'intervalo_de_repetição',
    end_date        => data_de_término,
    enabled         => verdadeiro_ou_falso,
    comments        => 'comentários');

Aqui, job_name é o nome do trabalho, job_type é o tipo de trabalho (como um bloco PL/SQL, uma procedure armazenada, um comando de shell, etc.), e job_action é a ação que o trabalho deve realizar. start_date e end_date são as datas de início e término do trabalho, enabled especifica se o trabalho deve ser habilitado imediatamente após a criação, e comments é uma área para quaisquer comentários ou descrições que você queira incluir.

A parte que estamos mais interessados aqui é repeat_interval, que determina com que frequência o trabalho é executado.

Usando repeat_interval

O argumento repeat_interval é uma string no formato Calendário do Oracle. É incrivelmente flexível e permite que você especifique a frequência da tarefa de várias maneiras diferentes. Aqui estão alguns exemplos para diferentes frequências:

Intervalo fixo

Este formato permite que você execute o trabalho a cada X segundos. Por exemplo, para executar o trabalho a cada 10 minutos, você usaria:

repeat_interval => 'FREQ=MINUTELY;INTERVAL=10'

Horário específico todos os dias

Para executar o trabalho em um horário específico todos os dias, você pode usar:

repeat_interval => 'FREQ=DAILY;BYHOUR=14;BYMINUTE=0;BYSECOND=0'  -- executa todos os dias às 14h

Agendamento semanal

Para executar o trabalho em dias específicos da semana (por exemplo, de segunda a sexta-feira às 14h), você pode usar:

repeat_interval => 'FREQ=WEEKLY;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=14;BYMINUTE=0;BYSECOND=0'

Agendamento mensal

Para executar o trabalho em um dia específico do mês (por exemplo, todo dia 15 do mês às 14h), você pode usar:

repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=15;BYHOUR=14;BYMINUTE=0;BYSECOND=0'

Agendamento anual

Para executar o trabalho em um dia e mês específicos do ano (por exemplo, todos os anos em 1º de janeiro às 00h), você pode usar:

repeat_interval => 'FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=1;BYHOUR=0;BYMINUTE=0;BYSECOND=0'

REPEAT_INTERVAL

O repeat_interval é uma string no formato Calendário do Oracle. Esta string é muito flexível e permite especificar a frequência da repetição de muitas maneiras diferentes. Aqui estão os componentes mais comuns que você pode usar:

  • FREQ: Pode ser YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY ou SECONDLY. Define a frequência base para a repetição.
  • INTERVAL: Especifica um intervalo para a frequência indicada em FREQ. Por exemplo, INTERVAL=2 com FREQ=DAILY significa “a cada dois dias”.
  • BYMONTH: Especifica os meses em que a tarefa deve ser executada. Por exemplo, BYMONTH=JAN, JUL executará a tarefa apenas em janeiro e julho.
  • BYMONTHDAY: Especifica os dias do mês em que a tarefa deve ser executada. Por exemplo, BYMONTHDAY=1,15 executará a tarefa nos dias 1 e 15 de cada mês.
  • BYDAY: Especifica os dias da semana em que a tarefa deve ser executada. Por exemplo, BYDAY=MON, WED, FRI executará a tarefa em todas as segundas, quartas e sextas-feiras.
  • BYHOUR, BYMINUTE, BYSECOND: Especifica a hora do dia em que a tarefa deve ser executada.

Esses são apenas alguns dos muitos componentes que você pode usar. Para uma visão mais completa, você pode verificar a documentação oficial do Oracle.

EXEMPLOS

Intervalo fixo: isso executa a tarefa a cada X segundos. Por exemplo:

DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'meu_trabalho',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN NULL; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=SECONDLY;INTERVAL=600',  -- executa a cada 10 minutos
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Executa a cada 10 minutos.');

Horário específico todos os dias: isso executa a tarefa em um horário específico todos os dias.

DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'meu_trabalho',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN NULL; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY;BYHOUR=14;BYMINUTE=0;BYSECOND=0',  -- executa todos os dias às 14h
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Executa todos os dias às 14h.');

Agendamento semanal: isso executa a tarefa em dias específicos da semana.

DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'meu_trabalho',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN NULL; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=WEEKLY;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=14;BYMINUTE=0;BYSECOND=0',  -- executa de segunda a sexta às 14h
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Executa de segunda a sexta às 14h.');

Agendamento mensal: isso executa a tarefa em um dia específico do mês.

DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'meu_trabalho',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN NULL; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=15;BYHOUR=14;BYMINUTE=0;BYSECOND=0',  -- executa todo dia 15 do mês às 14h
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Executa todo dia 15 do mês às 14h.');

Estes são alguns exemplos dos formatos que você pode usar. Lembre-se de que você pode personalizar a string repeat_interval para atender às suas necessidades específicas.

Sobre o autor

Pós graduado em Gestão de Projetos em Tecnologia da Informação pela UNIASSELVI.
Esposo e Pai, curto atividades ao ar livre (Bike, SUP, Natação, Caminhar, Brincar no campo)

Atua com Banco de Dados Oracle desde de 2007. Atualmente é DBA Senior na FLUIDATA Serviços em Banco de dados (www.fluidata.com.br)

Principais atividade Banco de dados:

Implementação, migração, gerenciamento e suporte a produtos Oracle (8i, 9i, 10g, 11g, 12c, 18c, 19c RAC), multiplataforma;
Implementação, migração, gerenciamento e suporte a produtos Microsoft SQL Server (2008 - 2019);
Implementação, migração, gerenciamento e suporte a produtos PostgreSQL (9.3 - 14);
Monitoramento de ambientes 24×7;
Backup e Recovery;
Performance e Tuning;
Alta disponibilidade (HA);
EM database/grid/cloud control;
Conversão de databases;
Standby database / Oracle Data Guard;

Certificações:

Oracle Cloud Infrastructure 2019 Certified Architect AssociateOracle Cloud Infrastructure 2019 Certified Architect Associate
Oracle Database 12c Administrator Certified ProfessionalOracle Database 12c Administrator Certified Professional
Exadata Database Machine Models X2-2 and X2-8 Technology Support SpecialistExadata Database Machine Models X2-2 and X2-8 Technology Support Specialist
Oracle Database 11g Support SpecialistOracle Database 11g Support Specialist
OCP 11g - Oracle Certified Professional AdministratorOCP 11g - Oracle Certified Professional Administrator
OPN Certified Specialist 10g - PartnerNetwork Certified SpecialistOPN Certified Specialist 10g - PartnerNetwork Certified Specialist
Oracle Database 10g Real Applications Clusters AdministratorCertified ExpertOracle Database 10g Real Applications Clusters AdministratorCertified Expert
Oracle Database 10g: Managing Oracle on Linux Certified ExpertOracle Database 10g: Managing Oracle on Linux Certified Expert
OCP 10g - Oracle Certified Professional AdministratorOCP 10g - Oracle Certified Professional Administrator

Principais atividades DEVOPS:

PHP
ASP.net
C#
Docker
Golang
C++
Delphi
Python
HTML5
JavaScript

Você também pode gostar: