Merhaba, Oracle ve gariplikleriyle tanışalı yaklaşık 1 yıl oldu. Bu süre zarfında birçok kez kendime şu tarz sorular sordum durdum: “SQL Server’da şunu böyle yapıyorduk, acaba Oracle’da nasıl yapılıyor?”. Bu sorulardan bir tanesi de auto increment yapısının Oracle’da nasıl sağlanabileceğiydi. Projemizi bazı sebeplerden dolayı SQL Server’dan Oracle’a taşıdık; ancak SQL Server üzerinde birçok tablomuzda auto increment özelliği kullanılıyordu. Dolayısıyla bir şekilde bu özelliği Oracle’a entegre etmemiz gerekiyordu. Biz de aşağıda anlatacağım yöntemi kullanarak Oracle’da auto increment yapısını kurmuş olduk. Umarım sizin için de faydalı olur.
Auto Increment Nedir?
Auto increment, kelime anlamı olarak “Otomatik Arttırım” demektir. Projelerde genellikle “ID” kolonlarında kullanılır. Örneğin, bir kategori tablonuz var ve bu tablodaki her kayıt için eşsiz bir değeriniz olsun istiyorsunuz. Bunu sağlamanın en kolay yolu, ID isimli bir kolon oluşturup bu kolonun değerini auto increment olarak ayarlamaktır. Yani, siz tabloya her yeni kayıt eklediğinizde ID kolonu 1’den (veya istediğiniz bir sayıdan) başlayarak birer birer (veya istediğiniz aralıkla) otomatik olarak arttırılacaktır. Ms SQL Server ve MySQL gibi kullanım oranı yüksek veritabanlarında bu özellik uzun süredir mevcuttur ve sıklıkla da kullanılmaktadır. Oracle’da ise böyle bir özellik yok (benim bildiğim kadarıyla).
Oracle Auto Increment Yapısı
Oracle’da varsayılan olarak gelmeyen bu özelliği sağlayabilmek için sequence + trigger ikilisine ihtiyacımız var. Bu yapıyı açıklayacak olursak tabloya yapılacak her insert öncesinde trigger çağırılacak ve bu trigger içerisinde, ID kolonunun değeri sequence’dan elde edilecek veri ile doldurulacak. Bilmeyenler için trigger; belirlemiş olduğunuz insert, update, delete gibi herhangi bir işlemden önce ve/veya sonra çalışan kod bloğudur. Sequence ise, bir nevi, number tipinde tutulan global bir değişkendir.
Sequence Nasıl Oluşturulur?
Bir sequence oluşturmak için aşağıdaki komutu kullanabilirsiniz:
create sequence sequence_adi;
Auto Increment için Trigger Nasıl Oluşturulur?
Yukarıdaki komut ile sequence objemizi oluşturduktan sonra bu objeyi kullanan bir insert – before trigger aşağıdaki şekilde oluşturulabilir:
create or replace trigger trigger_adi
before insert on tablo_adi
referencing new as new old as old
for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
begin
select sequence_adi.nextval into :new.ID from dual;
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;
Eğer isterseniz yukarıdaki select ifadesinin öncesine bir IF koşulu yazarak ID’nin sadece 0 ve null geldiği durumlarda sequence’den alınmasını sağlayabilirsiniz. Sequence’ler ile ilgili daha detaylı bilgiyi bir sonraki makalemde paylaşacağım…