martes, 3 de julio de 2012

DBMS_SCHEDULER - Modificación, ejecución de jobs

DBMS_SCHEDULER reemplazó ya hace un tiempo al paquete DBMS_JOB como procedimiento a usar para la creación y modificación de jobs y eventos programados en nuestra base de datos Oracle.

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.

11 comentarios:

  1. La sacaste del estadio, muy bien explicado hermano, me salvaste

    ResponderEliminar
  2. 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.

    ResponderEliminar
  3. Hola 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) ?

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Repeat Interval = FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=10,11,12,13,14;BYMINUTE=0, 10,20,30,40,50

      Eliminar
  4. Buenas 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.
    (es decir del 1 al 10 de cada mes no debe ejecutarse), algún consejo de como realizar esta programación .

    ResponderEliminar
    Respuestas
    1. Está podría ser una opción:

      FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=14;BYMINUTE=00; BYMONTHDAY=10

      Eliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar