A continuación escribo una pequeña recopilación de tareas que se pueden hacer con este paquete.
Para los ejemplos he usado un procedimiento "PROCTEST" que lo único que hace es insertar unas filas en una tabla de pruebas.
Creación de Job.
En este ejemplo creamos un job que ejecuta un PL/SQL. El job se ejecuta dentro de 10 minutos.
begin
dbms_scheduler.create_job (
job_name => 'JOB_TEST',
job_type => 'PLSQL_BLOCK',
job_action => 'begin PROCTEST(2); end;',
number_of_arguments => 0,
start_date => sysdate +10/24/59, -- sysdate + 10 minutos
job_class => 'DEFAULT_JOB_CLASS', -- Priority Group
enabled => TRUE,
auto_drop => TRUE,
comments => 'JOB de prueba');
end;
/
Arrancar un Job manualmente.
begin
dbms_scheduler.run_job('JOB_TEST',TRUE);
end;
/
Reiniciar un Job.
begin
dbms_scheduler.disable('JOB_TEST');
dbms_scheduler.enable('JOB_TEST');
end;
/
Borrar un Job.
begin
dbms_scheduler.drop_job('JOB_TEST');
end;
/
Creación de Intervalos de Tiempo.
Es posible crear horarios personalizados para luego programar los jobs. A continuación algunos ejemplos:
-- intervalo diario
begin
dbms_scheduler.create_schedule
(schedule_name => 'INTERVALO_DIARIO',
start_date=> trunc(sysdate)+18/24,
repeat_interval=> 'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI,SAT,SUN; BYHOUR=20;',
comments=>'Ejecucion: Todos los dias a las 20:00');
end;
/
-- intervalo cada hora
begin
dbms_scheduler.create_schedule(
schedule_name => 'INTERVALO_CADA_HORA',
start_date => trunc(sysdate)+18/24,
repeat_interval => 'freq=HOURLY;interval=1',
comments => 'Ejecucion: cada hora');
end;
/
-- intervalo cada 10 minutos
begin
dbms_scheduler.create_schedule(
schedule_name => 'INTERVALO_CADA_10_MINUTOS',
start_date => trunc(sysdate)+18/24,
repeat_interval => 'freq=MINUTELY;interval=10',
comments => 'Ejecucion: cada 10 minutos');
end;
/
-- todos los viernes a las 14:00
begin
dbms_scheduler.create_schedule
(schedule_name => 'INTERVALO_VIERNES_1400',
start_date=> trunc(sysdate)+18/24,
repeat_interval=> 'FREQ=DAILY; BYDAY=FRI; BYHOUR=14;',
comments=>'Ejecucion: Cada viernes a las 14:00');
end;
/
Podemos consultar los intervalos de tiempo con la select:
SELECT owner, schedule_name, schedule_type, start_date, repeat_interval FROM dba_scheduler_schedules;
Borrado de Intervalos de Tiempo.
begin
dbms_scheduler.drop_schedule('INTERVALO_DIARIO');
end;
/
Creación de Programa y Jobs con asignación de Schedule.
Podemos crear un programa que haga referencia al PL/SQL que queremos ejecutar, para así después crear un Job que ejecute ese programa según el horario que hemos creado previamente.
Creación del programa.
begin
dbms_scheduler.create_program
(program_name=> 'PROG_PROCTEST',
program_type=> 'PLSQL_BLOCK',
program_action=> 'begin PROCTEST(2); end;',
enabled=>true,
comments=>'Programa de TEST'
);
end;
/
Creación del Job con el horario.
begin
dbms_scheduler.create_job
(job_name => 'JOB_PROG_PROCTEST',
program_name=> 'PROG_PROCTEST',
schedule_name=>'INTERVALO_CADA_10_MINUTOS',
enabled=>true,
auto_drop=>false,
comments=>'Job que ejecuta el procedimiento PROCTEST cada 10 minutos');
end;
/
En otros artículos escribiré mas funcionalidades de este paquete.
Excelente informacion
ResponderEliminarLa sacaste del estadio, muy bien explicado hermano, me salvaste
ResponderEliminarBUENISIMOO
ResponderEliminarMUCHAS GRACIAS
SALUDOS
Consulta, tengo un JOB que se ejecuta cada 3 segundos, este Job llama a un procedimiento almacena (inserta y commit), mi duda es si el segundo llamado se ejecuta independiente a si el job aun sigue en ejecución.
ResponderEliminardepende cómo haya sido programado el JOB
EliminarHola una pregunta, y para que se ejecute cada 10 minutos solamente entre las 10:00hrs y 14:00hrs ? Es decir que solo se active en ese horario( entre 10am y 2pm) ?
ResponderEliminarEste comentario ha sido eliminado por el autor.
EliminarRepeat Interval = FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=10,11,12,13,14;BYMINUTE=0, 10,20,30,40,50
EliminarBuenas tardes, estimados tengo el siguiente desafió, debo ejecutar un Job de lunes a viernes a las 14 horas exceptuando los 10 primeros días de cada mes.
ResponderEliminar(es decir del 1 al 10 de cada mes no debe ejecutarse), algún consejo de como realizar esta programación .
Está podría ser una opción:
EliminarFREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=14;BYMINUTE=00; BYMONTHDAY=10
Este comentario ha sido eliminado por el autor.
ResponderEliminar