Przede wszystkim garść podstawowych pojęć:
job – określa co ma być zrobione. Moze to być program pl sql albo skrypt na dysku. Przy definiowaniu joba możesz tez zdefiniować jego częstotliwość uruchamiania.
Schedule - to taki terminarz wykonywania jobów. Możesz zrobić schedula który odpala się codziennie o 15 i podpiąć pod niego kilka jobów. Dzięki temu on te joby odpala, a kiedy zmienisz częstotliwość schedula to i wszystkie joby będą się odpalały wg nowych ustawień i nie musisz dla każdego joba zmieniać tego oddzielnie.
Program – w nim możesz zdefiniować dzialania. Następnie możesz go podpiąć pod wiele jobów dzięki czemu one będą wywoływały program. I jak coś w nim zmienisz to zmiana ta będzie uwzględniona niezależnie od tego jaki job ją wykonuje.
Przykład tworzenia schedula:
BEGIN
DBMS_SCHEDULER.create_schedule (
schedule_name => 'test_hourly_schedule',
start_date => SYSTIMESTAMP,
repeat_interval => 'freq=hourly; byminute=0',
end_date => NULL,
comments => 'Repeats hourly, on the hour, for ever.');
END;
Kasowanie schedula:
BEGIN
DBMS_SCHEDULER.drop_schedule (schedule_name => 'TEST_HOURLY_SCHEDULE');
END;
Przyklad tworzenia programu wykonującego jakiś kawałek kodu pl sql:
BEGIN
-- PL/SQL Block.
DBMS_SCHEDULER.create_program (
program_name => 'test_plsql_block_prog',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
enabled => TRUE,
comments => 'Program to gather SCOTT''s statistics using a PL/SQL block.');
end;
Przyklad tworzenia programu wywołującego jakiś skrypt na dysku:
begin
DBMS_SCHEDULER.create_program (
program_name => 'test_executable_prog',
program_type => 'EXECUTABLE',
program_action => '/u01/app/oracle/dba/gather_scott_stats.sh',
number_of_arguments => 0,
enabled => TRUE,
comments => 'Program to gather SCOTT''s statistics us a shell script.');
end;
Przykład kasowania programu:
begin
DBMS_SCHEDULER.drop_program (program_name => 'test_plsql_block_prog');
end;
Możesz sobie stworzyć zwykłego najprostszego joba bez oddzielnego schedula i bez korzystania z programu, tylko takiego gdzie w samym jobie masz okreslone co ma być wykonane i kiedy (czestotliwość wykonywania tez). To się robi tak:
begin
DBMS_SCHEDULER.create_job (
job_name => 'test_full_job_definition',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'freq=hourly; byminute=0',
end_date => NULL,
enabled => TRUE,
comments => 'Job defined entirely by the CREATE JOB procedure.');
end;
Możesz też po wcześniejszym stworzeniu programu i schedula zrobić sobie joba związanego ze schedulem (więc nie musisz podawać częstotliwości, bo ta jest określona w schedulu do którego job jest podpięty). Dodatkowo nie piszesz kodu który ma zostać wykonany a jedynie nazwę programu który jest przez joba wywoływany (w nim jest przecież kod):
begin
DBMS_SCHEDULER.create_job (
job_name => 'test_prog_sched_job_definition',
program_name => 'test_plsql_block_prog',
schedule_name => 'test_hourly_schedule',
enabled => TRUE,
comments => 'Job defined by an existing program and schedule.');
end;
Możliwości te możesz mieszać. Tutaj np. nie piszę kodu bezpośrednio w jobie tylko kod jest w programie a to program wywołuje z joba, ale np. już częstotliwość podaje w samym jobie:
begin
DBMS_SCHEDULER.create_job (
job_name => 'test_prog_job_definition',
program_name => 'test_plsql_block_prog',
start_date => SYSTIMESTAMP,
repeat_interval => 'freq=hourly; byminute=0',
end_date => NULL,
enabled => TRUE,
comments => 'Job defined by existing program and inline schedule.');
end;
tudzież w drugą stronę. Podpinam pod schedula (czyli czestotliwość jest w schedulu i nie muszę jej podawać ręcznie, ale już sam kod który ma zostać wykonany piszę bezpośrednio w jobie:
begin
DBMS_SCHEDULER.create_job (
job_name => 'test_sched_job_definition',
schedule_name => 'test_hourly_schedule',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
enabled => TRUE,
comments => 'Job defined by existing schedule and inline program.');
END;
O a tutaj masz joba który jest podpięty do schedula ale wywołuje skrypt na dysku zamiast kodu pl sql:
begin
DBMS_SCHEDULER.create_job (
job_name => 'test_sched_job_definition',
schedule_name => 'test_hourly_schedule',
job_type => 'EXECUTABLE',
job_action => 'c:\dupadupa\twojastara.bat',
enabled => TRUE,
comments => 'Job defined by existing schedule and inline program.');
END;
Konfiguracja i mieszanie jak widzisz dowolne.
Joba można oczywiście skasować:
begin
DBMS_SCHEDULER.drop_job (job_name => 'test_full_job_definition');
end;