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.
[responsivevoice_button voice=”Polish Female” buttontext=”Odtwórz” ]