15 września 2010

Zadania cykliczne w bazie Oracle - pakiet DBMS_JOB

Ilekroć pada stwierdzenie, że jakiś proces powinien być uruchamiany cyklicznie, pada też stwierdzenie, że należy napisać skrypt uruchamiany przez Unixowego demona CRON. Pewnie nie jest to podejście złe, ale jeśli jedyne co trzeba robić, to wykonywać operacje na bazie danych Oracle, to można to zrobić prościej, w ramach samego Oracla, przy użyciu pakietu DBMS_JOB.

Aby zdefiniować i uruchomić cyklicznie zadanie operujące na danych w bazie danych Oracle wystarczy napisać procedurę składowaną PL/SQL i uruchomić funkcję SUBMIT(…) z pakietu DBMS_JOB, przekazując jako argumenty wywołania nazwę procedury PL/SQL, czas pierwszego uruchomienia oraz wyrażenie określające interwał.

Przykładowo, jeśli chcemy aby procedura składowana o nazwie DO_CLEAN uruchamiana była co dzień o godzinie 1:00 w nocy, to wystarczy wykonać blok:
VARIABLE v_jobno NUMBER;
BEGIN
dbms_job.submit(:v_jobno,'DO_CLEAN;',trunc(sysdate)+1+1/24,'trunc(sysdate)+1+1/24');
END;
Definicje zadań uruchomionych w powyższy sposób są umieszczane w tabeli systemowej USER_JOBS. Możemy tam wyszukać nasze zadania i zobaczyć jaki jest ich status. Dobra dokumentacja pakietu DBMS_JOB jest na stronie http://psoug.org/reference/dbms_job.html.

Jeśliby nam chodziło o cykliczne kasowanie starych (starszych niż 5 dni) danych z tabeli LOGS to procedura DO_CLEAN mogłaby wyglądać następująco:
CREATE PROCEDURE DO_CLEAN IS
ts_max TIMESTAMP := trunc(current_timestamp - 5);
BEGIN
DELETE FROM logs WHERE logs.ts < ts_max;

COMMIT;
END DO_DELETE;
W najnowszych wersjach bazy danych Oracle powinno się zamiast pakietu DMBS_JOB używać pakietu DBMS_SCHEDULER, aczkolwiek wersja z którą ja pracuję jeszcze na tyle nowa nie jest.

1 komentarz:

Rafał pisze...

Dla posiadaczy baz danych MS SQL Server jest narzędzie Microsoft SQL Server Agent, w którym można definiować joby, które uruchamiają T-SQL.