dbms_scheduler
Os comento lo dado sobre este paquete “dbms_scheduler” en un curso de PLSQL Avanzado 10g.
Se encuenta a partir de la versión 8. Es una mejora del paquete DBMS_JOB, pero podemos seguir utilizando los dos.
En este artículo trataré las siguientes funciones y procedimentos, con un ejemplo de cada uno de ellos para que resulte más “entretenido” …
1. CREATE_JOB
2. DROP_JOB
3. STOP_JOB
4. RUN_JOB
5. COPY_JOB
6. ENABLE
7. DISABLE
8. SET_ATTRIBUTE
Este paquete:
1. Permite ejecutar no solo programas almacenados o bloques de PL/SQL, sino también ejecutar programas del propio sistema operativo.
2. En DBMS_JOB sólo existe un componente, en el SCHEDULER hay múltiples.
3. Los intervalos de planificación se expresan de una forma más natural que el JOB.
4. Devuelve el control de los JOBS existentes.
Los procesos pueden encontrarse en diferentes estados dependiendo de las operaciones que realicemos sobre ellos:
• SUCCEEDED. Ha sido parado sin haber finalizado.
• SCHEDULED. Indica que l proceso está siendo encolado y dentro de un scheduler
• COMPLETED. Ha finalizado correctamente
Funciones y procedimientos.
1. CREATE_JOB
Crea un trabajo para ser lanzado posteriormente.
El procedimiento está sobrecargado, se puede ejecutar de varias formas
El propietario del trabajo es el usuario en cuyo esquema se crea el trabajo
Los trabajos se ejecutan con los privilegios del esquema en el cual se crean.
Cualquier trabajo se puede consulta en la vista: USER/ALL_SCHEDULER_JOBS.
Los trabajos se crean inactivos y es necesario activarlos para ser ejecutados.
El usuario que quiera crear un trabajo necesita privilegios de CREATE JOB y CREATE ANY JOB.
Parámetros:
job_name IN VARCHAR2, -> Identificador del trabajo
job_type -> Tipo de trabajo generado (PLSQL_BLOCK, STORED PROCEDURE, EXECUTABLE)
job_action -> Especifica la acción a realizar.
number_of_arguments IN PLS_INTERGER AUTO -> Por defecto 0
program_name IN VARCHAR 2, -> Nombre del programa asociado al trabajo.
start_date IN TIMESTAMP WHIT TIME ZONE DEFAULT NULL,-> Fecha en la cual el trabajo se ejecutará, si es nulo el trabajo arrancará cuando sea habilitado.
repeat_interval IN VARCHAR2 DEFAULT NULL, -> Intervalo de ejecución. Si no se indica nada sólo una vez.
end_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL, -> Fecha tras la cual el trabajo no va a ser ejecutado más. Si no se indica nada el trabajo se ejecutará indefinidamente hasta que se haga max_runs o max_failures.
job_priority IN NUMBER, -> Prioridad del trabajo (1 alta, 5 baja) por defecto 3.
enabled IN BOOLEAN DEFAULT FALSE, -> Especifica si el trabajo se habilita o no al ser creado.
auto_drop IN BOOLEAN DEFAULT TRUE, -> Si es true el trabajo será borrado después de ser ejecutado o ser deshabilitado.
comments IN VARCHAR2 DEFAULT NULL);
Paramétros del repeat_interval:
Puede ser expresado como expresión PL/SQL o como expresión Scheduler Calendaring:
DAILY
HOURLY
MINNTELY
SECONDELY
WEEKLY
MONTHLY
YEARLY
– Expresión PL/SQL
Repeat_Interval -> ‘Systimestamp + interval ‘30’ minute’;
– Expresión Scheduler Calendaring
FREQ=DAILY, BYDAY=FRI (ejecución los viernes)
FREQ=WEEKLY, BYDAY=FRI (ejecución los viernes)
FREQ=YEARLY, BYDAY=0310 (ejecución el diez de marzo)
FREQ=HOULRY, BYMONTHDAY=1,2,3 (ejecución los 3 primeros días del mes cada hora)
El parámetro interval al no poner nada toma el valor 1.
Por ejemplo al último si le pones 2 en el interval, sería dos veces cada hora.
– Privilegios:
grant manage scheduler to usuario;
– 1º ejemplo CREATE JOB
SELECT * FROM user_scheduler_jobs;
begin
dbms_scheduler.create_job(
job_name => ‘Mi_trabajo’,
job_type => ‘PLSQL_BLOCK’,
job_action => ‘insert into t1 values(342,”prueba”);’,
start_date =>’18/FEB/2007 13:20:00′,–SYSTIMESTAMP
repeat_interval => ‘FREQ=DAILY;INTERVAL=2′,
auto_drop => false,
end_date => ’18/FEB/2007 13:45:00′,
comments => ‘Este es mi trabajo’);
end;
/SELECT job_name,job_action,state,enabled,end_date FROM user_scheduler_jobs;
2. DROP_JOB
Equivalente al remove del paquete JOB.
Borra el trabajo indicado, es quitado de la cola y no puede volver ejecutarse.
Requiere ser el propietario del trabajo o tener privilegio de ALTER sobre él.
Si el trabajo se está ejecutando, se puede producir un error al intentar borrarlo, si pongo el parámetro FORCE=TRUE, lo fuerzo a borrarse.
Parámetros:
job_name
force ->Si es TRUE el planificador parará el trabajo y lo cerrará.
Si false se generará un error si está en ejecución, es el valor por defecto.
– Al ser opcion false se parará de inmediato el trabajo
begin
dbms_scheduler.drop_job(‘Mi_trabajo’,false);
end;
/
3. STOP_JOB
Detiene el trabajo indicado.
Al parar el trabajo el estado será SUCCEEDED.
Es necesario ser el dueño del trabajo o tener privilegios sobre él.
Parámetros:
job_name
force -> Si es TRUE parará inmediatamente el trabajo
Si está a false, el scheduler intenta parar de forma “ordenada” el proceso indicado.
Es necesario tener el privilegio MANAGE SCHEDULER para poder usuarlo.
Mejor utilizar el valor force=TRUE.
– Al ser opcion true se parará de inmediato el trabajo
begin
dbms_scheduler.stop_job(‘Mi_trabajo’);
end;
/
4. RUN_JOB
Sirve para ejecutar el trabajo inmediatamente.
Es necesario ser el dueño del trabajo o tener privilegios sobre él.
Se pueden consultar posibles errores que nos puedan dar cuando se intenta ejecutar en sesiones no propias en la tabla dba_scherduler_job ( consultando run_count, last_start_date, last_run_duration and failure_count)
Parámetros:
job_name
use_current_session-> Especifica si el trabajo se ejecuta en el misma sesión del esquema en la que ha sido invocado, defecto TRUE
El procedimiento falla si ya existe un trabajo ejecutándose o planificado para hacerlo.
– Al ser opcion true estamos indicando que el trabajo se ejecuta en la misma sesión en la que fue invocado
begin
dbms_scheduler.run_job(‘Mi_trabajo’);
end;
/
5. COPY_JOB
Copia los atributos de un trabajo a un nuevo trabajo.
El trabajo es generado deshabilitado y el trabajo original no cambia.
Parámetros:
old_job
new_job
DBMS_SCHEDULER.COPY_JOB(‘job1’,’job2’);
DBMS_SCHEDULER.RUN(‘job2’);
6. ENABLE
Habilita un programa, los cuales cuando son creados por defecto deshabiltados.
A partir de que este habilitado el SCHEDULE puede llevarlo a ejecución.
Antes de ser habilitado se chequea para ser correcto.
Con este se encola si se quiere ejecutar en el momento se hace con run_job.
Parámetros:
name -> Nombre del trabajo a habilitar, puede ser una lista separados por comas.
Si en vez de un nombre se especifica una clase, se habilitan todos los trabajos de esa clase.
– ENABLE Habilitamos el trabajo o ejecutamos directamente
begin
dbms_scheduler.enable(‘Mi_trabajo’);
end;
/SELECT job_name,job_action,state,enabled FROM user_scheduler_jobs;
7. DISABLE
Deshabilita un trabajo, quitándolo de la cola.
Si deshabilitamos un trabajo ya deshabilitado no genera error.
Parámetros:
name -> Nombre del trabajo a habilitar, puede ser una lista separados por comas.
force -> Si esta a FALSE y se está ejecutando, devuelve un error.
Si está a TRUE y se está ejecutando, se deshabilita y se permite que el trabajo finalice.
– Al estar a true y el trabajo está ejecutando, se deshabilita y se permite que el trabajo finalice
begin
dbms_scheduler.disable(‘Mi_trabajo’,true);
end;
/
8. SET_ATTRIBUTE
Sirve para cambiar los atributos de un objeto SCHEDULER.
Si es un objeto es alterado y está habilitado, el SCHEDULER lo deshabilita, aplica el cambio y lo vuelve a habilitar.
Parámetros:
name -> Nombre del trabajo a modificar
attribute -> Atributo a modifcar
value -> Valor para el atributo value IN [ VARCHAR2, TIMESTAMP WITH TIMEZONE, PLS_INTERGER. BOOLEAN, INTERVAL DAY TO SECOND]
Algunos atributos a modificar:
logging_level
restartable
max_failures
max_runs
job_priority
job_action
job_type
repeat_interval
start_date
end_date
job_class
comments
auto_drop
A partir de la Oracle 10g Release 2 disponemos de los siguientes procedimientos dentro del paquete:
– CREATE_SCHEDULE
Crea un nuevo SCHEDULER (es una lista de jobs)
– DROP_SCHEDULE
Borra un SCHEDULER
– SET_SCHEDULE
Modifica las características de un SCHEDULER (arranque, parade, resumen, etc …)
– UPDATE_SCHEDULE
Actualiza un SCHEDULER con nuevos parámetros.
En otro artículo os pondré unos ejemplos para verlo más claramente.
– ejemplo SET_ATTRIBUTE
begin
dbms_scheduler.set_attribute(‘Mi_trabajo’,’job_action’,’insert into t1 values(342,”prueba”); commit;’);
dbms_scheduler.set_attribute(‘Trabajo_nuevo’,’job_action’,’insert into t1 values(121,”prueba”); commit;’);
end;
/