19 Ekim 2012 Cuma

PL SQL Sequence Kulllanımı (Identity Column)

Oracle'da Otomotik Artan Kolon Oluşturmak (Sequence)

Bu makalemizde sizlere oracle'da otomatik olarak değeri artan veya azlan bir kolon nasıl oluşturulur bunu anlatmaya çalışacağız.Ms SQL 'deki IdentityColumn'a benzetebiliriz bunu.

Oracle'da bir tablo oluşturmak istediğinizi düşünelim tabloyu create edecek scripti hazırladınız kolonlarını girdiniz ve her kayıt eklendiğinde kayda özel tekrar etmeyen datalardan oluşan bir kolon eklemek istiyorsunuz ve bu alanı tablonuzun PK alanı yaptığınızı varsayalım.Kolonu "PK" olarak işaretlediniz NOT NULL dediniz fakat otomatik artırma olayını nasıl yapacaksınız bunu bulamadınız.

İşte bu noktada MS SQL veya MySQL'de olsa kolonu oluştururken bu kolon otomatik olarak artacak check'ini işaretlerdiniz ve tabloya kayıt eklendikçe bu kolon değeri otomatik olarak artardı.Fakat oracle'da kolonları oluştururken bu kolon otomatik olarak artsın diye bir check yok bu operasyonu manuel olarak yönetip Sequence kullanmanız gerekecektir.



Manuel olarak nasıl yapcağız ? Bunun için otomotik kolon talebinde bulunan tablo için bir adet Sequence oluşturmanız gerekmektedir.Sequenci oluşturduktan sonra tabloya kayıt atan Insert Into scriptinin values kısmında otomotik kolon karşılığı olan value alanına "SequenceName".NEXTVAL demeniz yeterli olacaktır.

Sistemde bir sequence oluşturmak için aşağıdaki gibi bir script hazırlamanız yeterli olacaktır.

CREATE SEQUENCE /*SEQUENCE NAME*/MIMRE.SQ_TABLE1
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999999999
NOCACHE 
NOCYCLE 
NOORDER 

START WITH : Sekansınızın başlangıç değerinin kaçtan başlamasını istiyorsanız bu değişkene o değeri vermelisiniz.

INCREMENT BY : Sekansınızın kaçar kaçar artacağını ve azalacağını bu değere vereceğiniz değer belirleyecektir örneğin +1 değerini verirseniz Sekansınız birer birer artacaktır. -1 değerini verirseniz Sekansınız  birer birer azalacaktır.

MINVALUE : Azalan sekanslar için sınırlayıcı değer olabilir çünkü bir sekansın gidebileceği minumum değeri ifade eder. Azalan sekanslar için özellikle bir MINVALUE tanımlanmaz ise sekansın gideceği limitte -10 üzeri 26 olacaktır.

MAXVALUE : Artan sekanslar için sınırlayıcı değer olabilir çünkü bir sekansın gidebileceği en fazla değeri ifade eder. Artan sekanslar için özellike bir MAXVALUE tanımlanmaz ise sekansın gideceği limitte 10 üzeri 27 olacaktır.

CYCLE : Sınırlayıcı eşik değere ulaştıktan sonra sekansın göstereceği davranışı belirler. CYCLE ifadesi ile sekans yaratılmış ise eşik değere ulaşıldıktan sonra sekans, başlangıç noktasına geri döner.

NOCYCLE : Bir sekans yaratırken varsayılan olarak NOCYCLE yaratılır yani sınırlayıcı eşik değere ulaşıldığı zaman sekans tamamlanır.

CACHE : Hafızada tutulması planlanan ve istenen sekans bloklarını ifade eder. Varsayılan blok sayısı 20'dir.

Sistemde bir hata meydana geldiği zaman yada database kapandığu zaman, cache ile tutuğumuz ve kullanmadığımız sequence ler kaybolacacaktır ve sistem tekrar çalışmaya başladığı zaman sequence kaldığı yerden devam edecek olup, aradaki değerler kaynayacaktır. Aradaki verileri kullanmak istiyorsak alter sequence komutu ile sequence yi yeniden düzenlememiz gerekmektedir.

NOCACHE : Data Dictionary'i sürekli olarak zorlayacak bu özellikle birlikte sekansın numaraların her güncellemede tutulmasını isteyebiliriz. Bunu yaparsak sekansın performansı azalacak ancak oluşturulacak olan sayılar arasında bir kopukluk olmaması garanti altına alınacaktır.

NOORDER : Sayıların talep doğrultusunda sıralı bir şekilde oluşturulmasını garantiler

Artık sequencimizi de oluşturduğumuza sekansımızın değerini artıran veya azaltan ve o anki değerlerini bize veren property'leri tanımaya.

Bunun için PL SQL'de kullanabileceğimiz 2 tane özellik bulunmaktadır.
"SEQUENCE_NAME".NEXTVAL ve "SEQUENCE_NAME".CURRVAL
.NEXTVAL : (NEXT VALUE) Bu özellik ile sekansınızın bir sonraki değerini ulaşmasını sağlarsınız.Yani diyelimki sekansınızın o anki değeri 10 siz bu sekans için "SEQUENCE_NAME".NEXTVAL derseniz sekansınız artan bi sekan ise ve INCREMENT BY değeri +1 ise yeni değeri 11 olacaktır, eğer INCREMENT BY değeri -1 ise bir sonraki değeri 9 olacaktır.

.CURRVAL : (CURRENT VALUE) Bu özellik ile sekansınızın o anki değeri ni elde edebilirsiniz.

Şimdi çok ufak bir örnek yapalım ve bir prosedür içerisinde bir tabloya INSERT işlemi yapan bir script hazırlayalım.

Tablomuz aşağıdaki gibi olsun.












CREATE OR REPLACE PROCEDURE MIMRE.URUN_EKLE
(
    P_URUN_AD VARCHAR2,
    P_URUN_ADET NUMBER,
    P_URUN_FIYAT NUMBER
)
IS
BEGIN

    INSERT INTO MIMRE.URUNLER
                        (
                            SQ_URUN_ID,
                            URUN_AD,
                            URUN_ADET,
                            URUN_FIYAT,
                            URUN_TOPLAM_FIYAT
                        )
                        VALUES
                        (
                            SQ_URUNLER.NEXTVAL,
                            P_URUN_AD,
                            P_URUN_ADET,
                            P_URUN_FIYAT,
                            P_URUN_ADET * P_URUN_FIYAT
                        );

END URUN_EKLE;
Evet sequence ile ilgili örneğimizi tamamladık.

Son olarak bir şey belirtmek istiyorum sequence'ler Rollback ve benzeri komutlardan etkilenmezler çünkü Rollback ve benzeri komutlar bir transaction üzerinde işlem yapmaktadırlar buna karşın sekanslar transaction bağımsız olarak, data dictionary'de güncellenmektedir.

Herkese Kolay Gelsin.

Hiç yorum yok:

Yorum Gönder