Özet: Veritabanında “job” tanımı, kullanımı ve düzenlemesi anlatılıyor.
Veritabanında bazı plsql batch işlerimizi, prosedür veya fonksiyonlarımızı belirli zaman periyotlarında otomatik çalıştırabilmek için job yapılarını kullanırız. Job’lar; DBMS JOB ve Scheduler JOB olarak iki ayrı durumda karşımıza çıkar. Scheduler (Programlanmış) Job’lar normal job’lara göre daha detaylı job’lar oluşturmamıza imkan verir.
Job’larla ilgli olarak aşağıdaki dictionary tabloları(ve view) kullanabilirsiniz;
all_scheduler_job_run_details
dba_scheduler_running_jobs
all_jobs
dba_jobs
dba_jobs_running
user_jobs
dba_scheduler_jobs
DBMS JOB
SELECT * FROM dba_jobs j, Dba_Jobs_Running jr WHERE what LIKE '%deneme_job%' AND j.failures IS NULL AND JR.FAILURES IS NULL AND JR.JOB = j.job;
Hergün saat 12:00 de belirli günlerde prosedürü çalıştıran aşağıdaki job içeriğini inceleyin.
Job’ı create etmek için;
DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what => 'EXECUTE IMMEDIATE ''alter session set nls_date_format = ''''DD.MM.YYYY''''''; IF TO_CHAR(SYSDATE,''d'') IN (2,3,4,5,6) THEN ORHAN.MY_PROCEDURE; END IF;' ,next_date => to_date('29/03/2017 09:08:00','dd/mm/yyyy hh24:mi:ss') ,interval => 'TRUNC(SYSDATE+1)+(12/24)' ,no_parse => FALSE ); SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x)); COMMIT; END; /
Job’ı drop etmek için;
Alttaki sorgu ile JOB kolonundan job no’sunu bulabilirsiniz.
select * from user_jobs;
job_no: 374915
EXEC DBMS_JOB.REMOVE(374915);
Job’ı çalıştırmak için;
job_no: 374915
EXEC dbms_job.run(374915);
Job’ın çalışma aralığını (interval) değiştirebiliriz;
EXEC DBMS_JOB.INTERVAL (job IN BINARY_INTEGER, interval IN VARCHAR2); EXEC dbms_job.interval(374915,'TRUNC(SYSDATE+1)+7/24');
Job’ın sonraki çalışma zamanını değiştirebiliriz;
EXEC DBMS_JOB.NEXT_DATE (JOB IN BINARY_INTEGER, NEXT_DATE IN DATE); EXEC dbms_job.next_date(374915, SYSDATE + 1/24);
SCHEDULER JOB
Hergün 08:00 ve 20:00 de çalışacak şekilde ayarlanmış aşağıdaki jobta begin – end plsql bloğunda belirtilen işi yapacaktır;
BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB ( job_name => 'ORHAN.DENEME_JOB' ,start_date => TO_TIMESTAMP_TZ('2013/09/03 21:00:00.475246 +03:00','yyyy/mm/dd hh24:mi:ss.ff tzr') ,repeat_interval => 'FREQ=DAILY; INTERVAL=1; BYHOUR=08,20' ,end_date => NULL ,job_class => 'DEFAULT_JOB_CLASS' ,job_type => 'PLSQL_BLOCK' ,job_action => ' BEGIN FOR c IN ( select USERNAME from dba_users ) LOOP ORHAN.DENEME_PROCEDURE ( p_username=> c.USERNAME ); END LOOP; END;' ,comments => 'Bu alana job i tanitacak sekilde aciklama girebilirsiniz' ); END; /
Enable etmek için;
begin SYS.DBMS_SCHEDULER.ENABLE(name => 'ORHAN.DENEME_JOB'); END;
Disable etmek için;
begin SYS.DBMS_SCHEDULER.DISABLE(name => 'ORHAN.DENEME_JOB'); END;
Çalıştırmak için;
begin SYS.DBMS_SCHEDULER.RUN_JOB(name => 'ORHAN.DENEME_JOB'); END;
Durdurmak için;
begin SYS.DBMS_SCHEDULER.STOP_JOB(name => 'ORHAN.DENEME_JOB'); END;
Drop etmek için;
begin SYS.DBMS_SCHEDULER.DROP_JOB(name => 'ORHAN.DENEME_JOB'); END;
Çalışma zamanını değiştirmek için;
BEGIN DBMS_SCHEDULER.set_attribute ( NAME => 'ORHAN.DENEME_JOB', ATTRIBUTE => 'repeat_interval', VALUE => 'FREQ=DAILY; byhour=5'); END;