Creación y Ejecución de Jobs en Oracle

Miguel
26 de Agosto del 2004
Hola, mi nombre es Miguel
Estoy tratando de ejecutar periódica y automáticamente un Job en Oracle pero no logró hacer que éste se ejecute en cada intervalo de tiempo definido (5 segundos). Este Job ejecuta un Stored Procedure que lee un tabla mediante un cursor y me actualiza otra tabla.
Ya definí el Job, ya está compilado de manera correcta en el intervalo deseado (SYSDATE+ 5/86400), incluso lo puedo ver activo en mi panel del TOAD, tb. lo puedo ejecutar cada vez que deseo,sin problema alguno, manualmente desde el TOAD, pero no logró que después se ejecute automáticamente en el intervalo que menciono, ¿será necesario tener el Stored Procedure dentro de un Package para que funcione bien o qué me está faltando configurar para poder hacer que se ejecute automáticamente?. Cabe
hacer mención que este Job lo he creado en primera instancia desde el TOAD 7.2.0.0.

La otra alternativa que me sugirieron y que ya he hecho es crear el job desde una sesión del SQL Plus, es decir, sin el TOAD, por que me han dicho que esta herramienta no es muy eficiente para tratar con los jobs, por lo que he creado un stored procedure para la creación del Job el cual se ha compilado y ejecutado correctamente, es decir, me ha creado correctamente el Job, dicho Stored lo describo a continuación;


CREATE OR REPLACE procedure crea_job
is
nojob number;

begin

dbms_job.submit(nojob,'SP_ACTUALIZA;',sysdate,'sysdate + 1/86400');

commit;

end;

he visto que el job fue creado por que he consultado la tabla de user_jobs de oracle y aparece ahí.

Ignoro si al ejecutar el Stored se activa el job automáticamente, es decir, que lo someta y lo ejecute, pues aparentemente no realizó nada, pues paso el tiempo y no ví ningún cambio en mis tablas.

Por si las dudas después de esto ejecute el job con el siguiente comando:

exec dbms_job.run(number);

donde number es el número del job que se le asignó al mismo al momento de crearse, el cual, al igual que en el TOAD, se ejecutó exitosamante el mismo.

una vez que he hecho esto, veo que mis actualizaciones se han realizado exitosamente y que en la tabla de user_jobs de oracle se ha calculado el siguiente periodo a ejecutarse (5 segundos después) para ese job. Esto lo checo con el siguiente comando:

select joB, substr(what,1,23), to_char(last_date,'HH:MI:SS'), TO_CHAR(NEXT_DATE,'HH:MI:SS'), FAILUREs
from user_jobs;


¿No se supone que una vez ejecutado por primera vez el Job, éste debería tomar el tiempo en que se ejecutó y calcular el próximo intervalo a ejecutarse para que, a partir del mismo, se ejecute después automáticamente y así sucesivamante? Esto lo
he checado cada vez que lo ejecuto manualmente pero no se vuelve a ejecutar, ¿qué pasa?
¿Los jobs pueden ejecutarse en intervalos de tiempo en segundos? Por que también he probado con intervalos de un minuto (SYSDATE + 1/1440) pero sucede exactamente lo mismo, no se ejecuta automáticamante después del periodo definido.


Por favor...ya tengo algo de tiempo con esto... alguién me podría ayudar con este detalle?

Gracias.

N?or
26 de Agosto del 2004
¿Realmente NO se ejecuta o simplemete NO ves cambios en la tabla?
Para ver esto verificá cada 5 segundos cambia el valor de next_time de la user_jobs ( también podés verificar en la dba_jobs_running para ver si el job aparece regularmente ).

Miguel
26 de Agosto del 2004
Hola Néstor
Agradezco tu atención, pues mira... ya he revisado la tabla que me has dicho: dba_jobs_running (esa no me la sabía.. gracias) y no me arroja ningún registro, así mismo he revisado la tabla de user_jobs y mantiene el mismo valor en la columna Next_time del intervalo calculado en la última vez que force la ejecución del Job (exec dbms_job.run(#)), es decir, si se hubiese ejecutado el Job me imagino que estaría refrescándose este valor después de cada ejecución, cosa que aún no hace automáticamente...

He estado consultando al mismo tiempo algunas cosas y por lo que he leido me parece que tiene que ver con el archivo init<sid>.ora, al cual hay que iniciarle un par de parámetros, los cuales son:

job_queue_processes=5 (5 por decir un valor)
job_queue_interval=1

Esto significa que se levantan 5 procesos nuevos que se despiertan cada minuto para ver si hay algún JOB para lanzar.

Muy probablemente sea esto, sólo que ahora que he revisado si tengo el archivo mencionado (Init<SID>.ora) me encuentro que tengo dos archivos.
El primero en el path C:oracleadminsherpapfile
y un segundo en: C:oracleora81database

En ninguno aparecen estos parámetros, pero si los edito para agregarlos no sé a cúal de los dos se lo agregaré?... Tú sabes?

Gracias


N?or
26 de Agosto del 2004
Antes de tocar nada podés fijarte que valores hay actualmente en tu insatlación:
Te conectás con system vía sqlplus y hacés:
SQL> show parameters job
Debaría mostrar job_queue_processes = n en donde n debe ser mayor a 0. Si llega a ser 0 entonces hacés:
SQL> alter system set job_queue_processes = 20;
Y te fijás s así arrancan.

Miguel
26 de Agosto del 2004
Muchas Gracias Nestór, he hecho lo que me sugeriste y ahora ya se encuentra ejecutándose el Job correctamente... Agradezco tu amable atención.
Saludos desde México