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 serYEARLY
,MONTHLY
,WEEKLY
,DAILY
,HOURLY
,MINUTELY
ouSECONDLY
. Define a frequência base para a repetição.INTERVAL
: Especifica um intervalo para a frequência indicada emFREQ
. Por exemplo,INTERVAL=2
comFREQ=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.