Ö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;