Home / MAKALELER / Veri Tabanı / Oracle Job Tanımı, DBMS_JOB Paketi ve DBA_JOBS

Oracle Job Tanımı, DBMS_JOB Paketi ve DBA_JOBS

Merhaba, Bu makalede Oracle veritabanında Job nedir, nerelerde kullanılırı ve Job kavramının detaylarını inceleyeceğiz.

 

Oracle Job Nedir ?
Joblar, Oracle veritabanına bağlı olan kullanıcıların tanımlayabildiği ve Oracle DB üzerinde çalışan işlerdir. Düzenli aralıklarla veya tek seferliğine çalıştırılabilirler. Burada dikkat edilmesi gereken nokta, tanımlanan Job’ın local makinada değil; Oracle Veritabanımızın kurulu olduğu server üzerinde çalışmasıdır. Örnek olarak, şirketimizin gelir gider raporunu belli bir saatte yöneticilere mail atmak istiyoruz diyelim. Bunun için yazılan PLSQL scripti Job olarak tanımlanarak, çalışacağı saat ve isteniyorsa çalışma aralığı (örneğin her hafta saat 8:30 da gibi) set edilerek kaydedilir. Belirtilen saat geldiğinde Oracle üzerinde bu kod, tanımlanan Job tarafından çalıştırılır.
Job Tanımı Nasıl Yapılır ?
Oracle’da Job işlemleri sistem paketi olan DBMS_JOB paketi üzerinden gerçekleştirilir. Bu işlem her ne kadar arayüz araçları (TOAD, PLSQL Developer, SQL Developer gibi) tarafından ekran kullanılarak gerçeklenebilse de; aslında arka tarafta yapılan iş DBMS_JOB pakedinin kullanılmasıdır.
Aşağıdaki script ile herhangi bir Oracle Job’ı tanımlayabiliriz :
DECLARE
 X NUMBER;
BEGIN
 SYS.DBMS_JOB.SUBMIT
   (job       =>X
   ,what      =>’begin
                                        UPDATE HR.EMPLOYEES
                                              SET SALARY = SALARY + 1000;
                                end;’
   ,next_date=>to_date(’31/12/2012 17:00:00′,’dd/mm/yyyy hh24:mi:ss’)
   ,interval =>’SYSDATE + 365′
   ,no_parse =>FALSE
 );
COMMIT;
END;
/
Şimdi bu kodun üzerinden açıklama yaparak ilerleyelim. Gördüğünüz gibi tanımlama işlemi normal bir plsql scriptini çalıştırmaktan farksız declare/begin/end blokları içinde gerçekleşiyor.
DBMS_JOB Nedir ?
DBMS_JOB, Oracle’ın SYS şeması altında bulunan bir package’dır. Yukarıdaki scriptte, bu paketin job’ı tanımlama görevini gerçekleştiren SUBMIT methodu çalıştırılmaktadır. Şimdi bu methodun parametrelerini inceleyelim :
                Job : Tanımlanan job ın id sidir. Oracle, tanımlanan her job’a unique bir numara atar ve o job’ı bu numarayla çağırır. Bizlerin öğrenciyken okul numaramız ne ise Oracle’ın job id si de budur.
                What : Tanımlanan job’ın ne iş yapacağı bilgisidir. Yukarıdaki örnekteki job çalıştığı zaman, employees tablosundaki maaşlara 1000 ekleme işini yapacaktır.
                Next_date : Job’ın çalışacağı tarih bilgisidir. Yukarıdaki örnekteki Job, 31 Aralık 2012 tarihinde saat 17:00 de çalışacaktır.
                Interval : Job’ın çalışma aralığıdır. Yukarıdaki örnekte sysdate+365 ile, Job’ın bir 1 sene aralıkla çalışması belirtilmiştir. Burada ilgili tarih gelip job başarılı bir şekilde tamamlandığında next_date i 31/12/2013 olacaktır.
Aşağıdaki 3 parametre de yine SUBMIT metoduna ait olmakla birlikte sık kullanılan özellikler değildir. Fakat bilgi olması açısından kısaca bahsedelim:   
No_Parse : Boolean bir değerdir. Default olarak “FALSE” set edilir. “TRUE” olarak çalıştırılırsa, job submit edilirken “what” içindeki kod compile edilmez. Saati geldiğinde çalıştırılmadan önce compile edilir. Yukarıdaki örnekte employees tablosunu update edecek bir job tanımlamıştık. Mesela sistemde “employees” adında bir tablo yoksa bu scripti çalıştırdığımızda “what” a yazılan script compile edilecek ve “table or view does not exists” hatası alarak job submit edilemeyecektir. Ama SUBMIT metodunu çağırırken “no_parse => TRUE” eklersek; submit işlemi yapılacak fakat compile işlemi 31/12/2012 17:00:00 de yapılacaktır. Yani o tarihe kadar sistemde employees tablosu create edilirse başarıyla çalışacaktır. Fakat tablo yoksa hatayı şimdi değil o tarihte çalışmadan önce alacaktır.
                Instance : Birden fazla instance mevcutsa, job ı hangi instance ın çalıştıracağını belirtmek için kullanılır.
Diğer DBMS_JOB Methodları :
Yukarıda DBMS_JOB paketinin job tanımını yapmak için kullanılan SUBMIT methodunu gördük. Şimdi Joblar üzerinde işlem yapmamıza yarayan diğer methodlara göz atacağız:
DBMS_JOB.RUN
Job’ın next_date saatini beklemeden manuel olarak o anda çalışması istendiğinde kullanılır.
 begin
     DBMS_JOB.run(82);
     commit;
 end;
 
DBMS_JOB.NEXT_DATE
Tanımlanmış job ın next_date değerini düzenlemeye yarar.
begin
 DBMS_JOB.next_date (job=>82,
                    next_date=>to_date(’10/09/2012′,’dd/mm/yyyy’)
                    );
 commit;
end;
 
DBMS_JOB.INTERVAL
Tanımlanmış job ın interval değerini düzenlemeye yarar.
begin
 DBMS_JOB.interval(job=>82,
                   interval=>’sysdate + 10′
                   );
 commit;
end;
 
DBMS_JOB.BROKEN
Job ın çalışması istenmiyorsa broken olarak set etmek için kullanılır. Yaptığı işlem; next_date değerini 4000 gibi bir yıla çekmektir.
begin
 DBMS_JOB.broken( job=>82,
                  broken=>true
                 );
 commit;
end;
 
DBMS_JOB.REMOVE
Adı üzerinde, Job ı remove eder. Burada önemli bir nokta; remove edilen job ın id si başka bir job a verilmez. 82 numaralı job remove edildiyse yeni gelen job 83 numarasını alır.
begin
 DBMS_JOB.remove (82);
 commit;
end;
 
DBMS_JOB.WHAT
Job ın çalıştıracağı işin set edilmesine yarar.
begin
 dbms_job.what(job=>82,
              what=>’begin
                                                    update hr.employees
                                                         set salary = salary+2500;
                                        end’
               );
 commit;
end;
DBA_JOBS Görüntüsü
Oracle’da sistem metadata bilgilerini barındıran birçok view bulunmaktadır. “dba_” ön eki ile başayan bu view lardan bir tanesi de şu an konumuzla alâkalı olan DBA_JOBS view ıdır. Burada veritabanı üzerinde tanımlanmış tüm jobların metadata verisi bulunmaktadır. Bu veriyi (yetkimiz bulunuyorsa)
select  * from DBA_JOBS;
Sorgusu ile görebiliriz. Şimdi bu view daki alanları ve hangi bilgiyi gösterdiklerini inceleyeceğiz:
Job : Job ın Oracle tarafından atanan id değeridir. (82 no’lu job gibi.)
Log_user : Job ı çalıştıran user bilgisidir.
Schema_user : Job ın hangi schema ya ait olduğu bilgisidir.
Priv_user : Job’ı çalıştırmaya yetkisi olan user bilgisidir.
Last_date : Job ın en son çalıştığı tarihi gösterir.
Last_sec : Job ın en son çalıştığı saati gösterir. Örnek olarak last_date i ‘30/12/2012 17:05:00’ olan bir job ın last_sec alanı ’17:05:00’ değerini gösterir.
This_date : Job ın başladığı tarihi gösterir.
This_sec : Job ın çalıştığı saati gösterir. (yukarıdaki örnek bunun için de geçerli)
Next_date : Job ın bir sonra çalışacağı tarihi gösterir.
Next_sec : Job ın bir sonra çalışacağı saati gösterir. . (yukarıdaki örnek bunun için de geçerli)
Total_time : Job ın toplam kaç saniye sürdüğünü gösterir.
Broken : Job broken mı değil mi bilgisini verir. (değeri ‘Y’ veya ‘N’ olur.)
İnterval : Yukarıda da bahsettiğimiz gibi interval değerini gösterir.
Failures : Job ın kaç kere hata aldığı bilgisidir. Job tanımlandığında bu alan null dır. Hata almadan tamamlanırsa bu alan 0 olur. Eğer hata alırsa; aldığı her hatada bu değer 1 artar ve next_date ötelenir.
What : Yukarıda da bahsettiğimiz gibi tanımlanan job’ın hangi işi yapacağı bilgisidir.

About Ercan Yazgan

Oracle Technologies Specialist Yalova Doğumluyum, İlköğretimimi İstanbulda, Lise eğitimini ise memleketim olan Gümüşhane'de Anadolu Lisesinde tamamladım. Lisans eğitimimi ise Sakarya Üniversitesinde, hayalim olan bilgisayar mühendisliğinde tamamladım. Üniversitedeyken kariyer hedefimi database teknolojileri üzerine belirledim ve Oracle ile projeler geliştirdim. Her zaman yeniye ve yeniliğe olan ilgimden dolayı lisans projemde ODI ve OBIEE teknolojilerini kullanarak veri ambarı sistemlerine giriş yaptım. Şu an özel bir şirkette PLSQL developer olarak çalışmaktayım. İlgi alanlarım ve bildiğim teknolojiler; PLSQL, Oracle forms/reports, Oracle Administration

İlginizi Çekebilir

SQL Server ile Veri Şifreleme

Bilgi teknolojilerinde verinin güvenliği çok kritik bir öneme sahiptir. Önemli verileri korumak için ekstra bir …

Bir Cevap Yazın