Sequence’ ler için sayaç tabloları denilebilir. Sequence’ ler sizin
belirlediğiniz bir noktadan istediğiniz oranda bir artış hızıyla, istediğiniz
bir değere kadar sayı üretirler.
Create sequence komutunun full syntax’ ı ;
CREATE SEQUENCE [schema.]sequencename
[INCREMENT BY number]
[START WITH number]
[MAXVALUE number | NOMAXVALUE]
[MINVALUE number | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE number | NOCACHE]
[ORDER | NOORDER] ;
Increment by ; Alınacak olan sıra
numarasının kaçar kaçar artacağını ifade eder.
Start With ; İlk alacağı değerin ne
olacağını ifade eder.
Maxvalue ; En son hangi sayıya
kadar değer üretileceğini ifade eder.
Minvalue ; Max değere
ulaşıldıkdan sonra başlanılacak olan değeri ifade eder (Eğer cycle create
edilmiş ise). Create edilme aşamasında Start with ile başlanılır. Start with
min value’ den daha az olamaz.
Cycle ; Maxvalue değerine
ulaşıldıkdan sonra tekrar başa dönülüp dönülmeyeceğini ifade eder. (Maxvalue
değerine ulaşıldığında, minvalue’ den başlayarak değer üretmeye devam
edileceğinden duplica kayıtlar oluşacaktır.)
Cache ; Performans için
önemlidir. Defaultda 20 değeri otomatik olarak cacheleyerek üretir. Değer
artırılabilir. (Deneyimler gösteriyorki
default değeri yeterli olmamaktadır, sizin uygulamanız saniyede 10 kere
sequenceden değer select ediyor ise, bu değeri 50000 olarak set edebilirsiniz.
Bunu kullanmakdan çekinmeyin)
Order ; Cluster databaseler ile
ilgilidir. Order cluster içindeki bütün instance’ larda sequence’ in sırayla
artması için zorlar.
Sequence’ ler sadece pozitif yönlü değil azalan bir seyirdede sayı
üretebilirler, increment by kısmına -1 veya eksi herhangi bir değer
girildiğinde azalan şeklinde sayı üretirler.
Sequence’ in en son hangi sayıyı ürettiğini görmek için;
SELECT seq14.currval FROM dual;
Sequence’ in üreteceği bir sonraki değeri görmek için;
SELECT seq14.nextval FROM dual;
(bu komut sequence’ den bir kaydı select ettiği için
Cache opsiyonu ile ilgili önemli bir not ; Cache değeri kaç ise sequence’ i çağırdığınız da o kadar sıra nosunu alıp
cache’ e çıkartıyor ve kullanım için hazır halde bekletiyor. Bu esnada sistemde
yaşanacak olan herhangi bir shutdown/startup durumu olursa cache’ lenmiş olan
sıra numaralarını kaybedersiniz. Dolayısıyla aralarda olamayan sıra noları ile
karşılaşırsanız sebeblerinden biri bu olacaktır. (bir diğer sebebi ilgili
sequence nextval ile dual tablosu kullanılarak select edilmiş olabilir)
Sequence’i create ettikden sonra alter sequence komutu ile bazı opsiyonlarını değiştirebilirisiniz. Syntax’ ı aşağdıaki gibidir ;
ALTER SEQUENCE sequencename
[INCREMENT BY number]
[START WITH number]
[MAXVALUE number | NOMAXVALUE]
[MINVALUE number | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE number | NOCACHE]
[ORDER | NOORDER] ;
Bikaç örnek ;
-- increment değerini
değiştirmek için ;
alter sequence seq14 increment
by 5 ;
-- max value değerini
değiştirmek için ;
alter sequence seq14 maxvalue
3000
-- max value değerini
değiştirmek için ;
alter sequence seq14 minvalue 5
-- cycle / nocycle değerini
değiştirmek için ;
alter sequence seq14 cycle
-- cache değerini değiştirmek
için ;
alter sequence seq14 cache 100
-- order -
noorder değerini değiştirmek için ;
alter sequence seq14 noorder
Start with değeri değiştirilemez. Sequence’ i restart etmenin yolu
drop-create etmektir.
Sequence’ leri bir alana otomatik olarak unique değer atamak için de insert
scriptlerinde kullanabilirsiniz ;
INSERT INTO seq_test_table
(id, name)
VALUES
(seq14.NEXTVAL, ‘deneme’);
(id, name)
VALUES
(seq14.NEXTVAL, ‘deneme’);
Sequence’ i drop etmek için;
Drop sequence seq14 ;
Sequence’ leriniz ile ilgili tüm detay bilgileri user/dba_sequence
tablosundan select edebilirsiniz.
SELECT *
FROM dba_sequences
where sequence_name = 'SEQ14'
Sequence’ ler ile ilgili alabileceğiniz hata mesajları ;
/* ora-04004 */
CREATE SEQUENCE seq10
INCREMENT BY 1
START WITH 10
MAXVALUE 100
MINVALUE 100
NOCYCLE
CACHE 20
ORDER
Error at line 1
ORA-04004: MINVALUE must be
less than MAXVALUE
Bu hata min value değerinin maxvalue ye eşit veya
büyük olduğunda alınır. Bu iki değerden biri düzeltilip tekrar
çalıştırılmalıdır.
/* ora-04006 */
CREATE SEQUENCE seq11
INCREMENT BY 1
START WITH 10
MAXVALUE 100
MINVALUE 11
NOCYCLE
CACHE 20
ORDER
Error at line 1
ORA-04006: START WITH cannot
be less than MINVALUE
Bu hata start with değerinin min value’ dan küçük
olarak verildiği durumda alınır.
Start with veya min value değerini kontrol edip, start
with değerini min value’ dan daha küçük olmayacak şekilde düzeltip tekrar
deneyiniz.
/* ora-08002 */
select seq12.currval from dual
*
Error at line 1
ORA-08002: sequence
SEQ12.CURRVAL is not yet defined in this session
Bu hata mesajı daha önce
create edilmiş olmasına rağmen henüz hiç kullanılmamış olan bir sequence’ sin
current değerinin öğrenilmeye çalışılmasından kaynaklanmaktadır. Önce ;
select seq12.nextval from dual
;
sonrasında
select seq12.currval from dual
;
çalıştırıldığında hata
vermeyecektir.
/* ora-08004 */
select seq13.nextval from dual
*
Error at line 0
ORA-08004: sequence seq13.NEXTVAL
exceeds MAXVALUE and cannot be instantiated
Bu hata sequence create
edilirken verilen maxvalue değerine ulaşıldığını göstermektedir. Bu değer
aşağıdaki script ile maxvalue değerinin artırılması ile çözümlenebilir (veya
sequence drop edilip kaldığı yerden başlayacak şekilde tekrar cretae
edilebilir)
ALTER SEQUENCE seq13 maxvalue
20;
/* ora-02283 */
alter sequence seq14 start
with 11
Error at line 1
ORA-02283: cannot alter
starting sequence number
Start with değeri alter edilemez.
(sonradan değiştirilemez)
Hiç yorum yok:
Yorum Gönder