Posts Tagged ‘ sequences

oracle auto-increment sorunsalı - 2

Önceki yazılarımdan birinde oracle tablo yapılarında auto-increment bir alan oluşturulamadığı bunun yerine sequences yapısının bulunduğundan bahsetmiştim.
O yazımı okuyan database sorumlumuz, yazıda eksik noktalarımın olduğu söyledi. Bunlardan bahsetmek istedim.
Oracle sequences yarattığınızda, belli bir süre için belli bir sayıda auto-increment id bloğu yaratıyor. Bu bloğu o sürede bitirmezseniz kullanılmıyor ve kaldığı yerden ayrı bir blog daha oluşturuyor. Örneğin 20 tane ayırdı. Süresi geçene kadar sadece 12 tanesini kullandınız ve süre bittiğinde geri kalan 8 id iptal oluyor. 21'den başlayarak yeni bir blog oluşturuyor.
Buna güzel bir örnek verebiliriz: Örneğin bankaya gittiniz fantazi olsun diye 10 tane sıra numarası aldınız. O gün saat 5 oldu banka kapandı. Ertesi gün geldiğinizde yeni bir blog almak zorunda kalacaksınız. Örneğin yaşanabilitesi her ne kadar fazla olmasa da bu duruma uygun bir örnek :)
Eğer sequences yaratırken cache yapısnı kullanmazsanız yukarda bahsedilenler geçerli olmayacaktır. Bunun içinde kullandığınız oracle tool'da sequcences yaratırken no-cache seçeneğini seçiyorsunuz. Eğer değiştirmez default olarak bırakırsanız cache'li ve 20'lik blog alarak yaratacaktır.

oracle auto-increment sorunsalı

Oracle ile tek taraflı sevişme olayım devam etmekte ve her gün "ohaaa!", "hadi canımmm!" şeklindeki nidalarım ofisin çeşitli noktalarından duyulmakta.
Bu tepkiye neden olan olaylardan birisi de geçenlerde oracle da bir tablodan data silmek için uniqe ve auto-incerement bir id'ye ihtiyaç duymamdı.
Bunu database yöneticimize söylediğimde oracle tablolarında auto-increment bir yapının bulunmadığını öğrendim. Bunun yerine sequences denen hede'nin bulunmakta. Bu arkadaş kendini tekrar etmeyen, unique ve auto-increment id'ler üretmekte. İlk olarak sqldeveloper'ın ilgili shema altında sequence kısmından bir sequences tablosu oluşturuyorsun. Başlangıç ve artış değerlerini vermeye dikkat edin. Insert ya da update işlemlerinde RESERVE_SEQ.NEXTVAL (sequences tablosunun ismi RESERVE_SEQ olsun) şeklinde havuzdan sıradaki id'yi çekiyorsun ve gerekli işlemleri yapıyorsun.

insert için örnek :

INSERT INTO TABLO (ID,KELIME) VALUES(RESERVE_SEQ.NEXTVAL,'$Kelime');

update için örnek :

UPDATE TABLO SET ID=RESERVE_SEQ.NEXTVAL WHERE ID='$Id';