Olá pessoal,

Tudo bem?

Estava trabalhando num cliente que gostaria de agendar um shell script para ser executado toda quinta-feira às 9:00 para remover traces antigos.

O cliente possuía um requisito: não queria agendamento pela Cron, mas sim pelo DBMS_SCHEDULER.

Vamos primeiro criar o schedule para execução toda quinta-feira às 9:00 horas.

BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE (
repeat_interval => 'FREQ=WEEKLY;BYTIME=090000;BYDAY=THU',
schedule_name => 'EVERY_THURSDAY_9AM');
END;
/

Como se trata de um shell script a ser executado, precisamos criar um programa pelo DBMS_SCHEDULER, que aponta para o shell script.

Vamos criar e ativar o programa:

BEGIN
DBMS_SCHEDULER.create_program(
program_name => 'PRG_REMOVE_OLD_TRACES',
program_action => '/home/oracle/scripts/remove_old_traces.sh',
program_type => 'EXECUTABLE',
number_of_arguments => 0,
comments => 'Program to run remove_old_traces.sh',
enabled => FALSE);


DBMS_SCHEDULER.ENABLE(name=>'PRG_REMOVE_OLD_TRACES');

END;
/

Por fim, vamos criar e ativar o job, que utilizará o programa criado anteriormente, assim como o schedule criado anteriormente, além de ativar o logging full para a execução desse job:

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'JOB_REMOVE_OLD_TRACES',
program_name => '"SYS"."PRG_REMOVE_OLD_TRACES"',
schedule_name => '"SYS"."EVERY_THURSDAY_9AM"',
enabled => FALSE,
auto_drop => TRUE,
comments => '',
job_style => 'REGULAR');




DBMS_SCHEDULER.SET_ATTRIBUTE( 
name => 'JOB_REMOVE_OLD_TRACES', 
attribute => 'store_output', value => TRUE);
DBMS_SCHEDULER.SET_ATTRIBUTE( 
name => 'JOB_REMOVE_OLD_TRACES', 
attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FULL);




DBMS_SCHEDULER.enable(
name => 'JOB_REMOVE_OLD_TRACES');
END;
/

Espero que seja útil.

Um abraço,

Vinicius