11 мая 2011 г.

oracle: dbms_job

Стандартные пакеты. DBMS_JOB

dbms_job может работать только с job'ами текущего пользователя!
После модификаций job'а нужно делать COMMIT !

Т.к. dbms_job оперирует с датой, то для примера получения нужных дат можно посмотреть oracle: работа с датой

Представления:
dba_jobs, all_jobs, user_jobs
dba_jobs_running, all_jobs_running, user_jobs_running



Enable/disable job

Отвечает ф-ция DBMS_JOB.BROKEN

Syntax
DBMS_JOB.BROKEN ( 
   job       IN  BINARY_INTEGER,
   broken    IN  BOOLEAN,
   next_date IN  DATE DEFAULT SYSDATE);

-- disable job
exec dbms_job.broken( jobno, true);
commit;


-- enable job
exec dbms_job.broken( jobno, false);
commit;

Но лучше ещё указать параметр NEXT_DATE, чтобы точно задать время, когда джоб запустится после того как его сделали готовым для выполнения, например:
-- enable job with NEXT_DATE
exec dbms_job.broken( jobno, false, TRUNC(SYSDATE+1)+1/24);
commit;


-- удалить job
exec dbms_job.remove(jobno);
commit;

-- запустить job
exec dbms_job.run(jobno);

-- установить next_date
exec dbms_job.next_date(jobno, TRUNC(SYSDATE+1)+1/24);


Добавить job (примеры):

-- каждый день в 02:00
DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => X
   ,what      => 'guppi.gather_call_part_stat();'
   ,interval  => 'trunc(sysdate)+1+2/24'
  );
COMMIT;
END;

-- каждый день в 03:00
DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => X
   ,what      => 'guppi.gather_osa_part_stat();'
   ,interval  => 'trunc(sysdate)+1+3/24'
  );
COMMIT;
END;

-- каждый день каждый час

DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => X
   ,what      => 'statspack.snap;'
   ,interval  => 'trunc(SYSDATE+1/24,''HH'')'
  );
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
/