Cykliczne uruchamianie zadań w Oracle

Praktycznie każdy automatyk, prędzej czy później, trafi na potrzebę cyklicznego uruchamiania zadań. Ten problem przybiera wiele form, więc rozwiązania są realizowane w różny sposób np. harmonogram zadań w Windowsie, tzw. joby w bazach danych lub cron (command run on) w Linuxie.

W wielu moich zleceniach spotkałem się z potrzebą utworzenia joba. Takim zleceniem, które utkwiło mi w pamięci to był klient, który zażyczył sobie otrzymywać raz w tygodniu maila z informacją o temperaturach w pewnym pomieszczeniu. Tak się składało, że jego dom posiadał już czujniki i dane z czujników były już w bazie danych.

Od kilku lat posiadam podręczny notatnik z poleceniami przydatnymi do zajmowania się jobami. W tym poście chciałbym zamieścić te kawałki kodu przydatne na co dzień.

Job – cykliczne polecenia

Podgląd jobów

SELECT * FROM ALL_JOBS WHERE WHAT LIKE '%PROCEDURA%';

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'), ALL_JOBS .*
  FROM ALL_JOBS WHERE WHAT LIKE'% PROCEDURA%';

SELECT * FROM ALL_SCHEDULER_JOBS;

Tworzenie joba

DECLARE
VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno,
      'BEGIN PAKIET.PROCEDURA; END;',
      SYSDATE,
      'SYSDATE + 7');
   COMMIT;
   DBMS_OUTPUT.PUT_LINE(jobno);
END;

DECLARE
VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno,
      'BEGIN PAKIET.PROCEDURA; END;',
      SYSDATE,
      'TRUNC(SYSDATE) + 6/24');
   COMMIT;
   DBMS_OUTPUT.PUT_LINE(jobno);
END;

BEGIN
   DBMS_SCHEDULER.CREATE_JOB(
     job_name => 'TEST_JOB',
     job_type => 'STORED_PROCEDURE',
     job_action => 'PAKIET.PROCEDURA',
     start_date => SYSDATE,
     repeat_interval => 'FREQ=DAYLI; INTERVAL=2',
     end_date => NULL,
     auto_drop => FALSE,
     job_class => 'batch_update_jobs',
     comments => 'komentarz');
END;

BEGIN
   DBMS_SCHEDULER.CREATE_SCHEDULE(
     schedule_name => 'TEST_SCHEDULE',
     start_date => SYSTIMESTAMP,
     repeat_interval => 'freq=hourly; byminute=0',
     end_date => NULL,
     comments => 'komentarz');
END;

Uruchamienie joba

BEGIN
   DBMS_JOB.RUN( :jobno, TRUE);
END;

BEGIN
  DBMS_SCHEDULER.RUN_JOB(
    JOB_NAME            => :jobno,
    USE_CURRENT_SESSION => FALSE);
END;

Zmiana terminu uruchamiania

BEGIN
   DBMS_JOB.NEXT_DATE ( :jobno, SYSDATE + 2/1440);
   --DBMS_JOB.RUN( :jobno, TRUE);
END;

Ustawienie statusu broken

exec dbms_job.broken(:jobno, true);
exec dbms_job.broken(:jobno, false);

Zmiana joba

BEGIN
   DBMS_JOB.CHANGE(:jobno, null, null, 'sysdate+3');
   --parametry: jobno, what, next_date, interval...
   COMMIT;
END;

Cykliczne zadania (joby) to część automatyzacji bazy, którą wykonuje się raz na jakiś czas. Zamiast szukać tego za każdym razem zestawiam tutaj polecenia w formie posta.

Jeśli jesteś zainteresowany podobnymi tematami napisz o tym. Tymczasem, tym wpisem zbieram kilka istotnych informacji i zapraszam do innych artykułów na blogu i na facebooka.

Leave a Reply

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *