İSİM¶
CREATE TYPE - yeni bir veri türü tanımlar
KULLANIM¶
CREATE TYPE isim AS
( öznitelik_ismi veri_türü [, ... ] )
CREATE TYPE isim (
INPUT = girdi_işlevi,
OUTPUT = çıktı_işlevi
[ , RECEIVE = alış_işlevi ]
[ , SEND = gönderim_işlevi ]
[ , ANALYZE = analiz_işlevi ]
[ , INTERNALLENGTH = { dahili_uzunluk | VARIABLE } ]
[ , PASSEDBYVALUE ]
[ , ALIGNMENT = hizalama ]
[ , STORAGE = strateji ]
[ , DEFAULT = öntanımlı ]
[ , ELEMENT = öğe_türü ]
[ , DELIMITER = ayraç ]
)
AÇIKLAMA¶
CREATE TYPE o anki veritabanında kullanmak için yeni bir
veri türü tanımlar. Türü tanımlayan
kullanıcı türün sahibi haline gelir.
Eğer bir şema ismi belirtilmişse, tür bu
şemada oluşturulur. Aksi takdirde, tür o anki
şemada oluşturulur. Tür ismi aynı şema
içinde mevcut veri türü ve veri alanı isimlerinden
farklı olmalıdır. (Tablolar ilişkili veri
türlerine sahip olduğundan, tür ismi ayrıca,
aynı şemada mevcut tablo isimlerinden de farklı
olmalıdır.)
Bileşik Türler¶
CREATE TYPE'ın ilk biçimi bir bileşik veri
türü oluşturur. Bileşik tür,
öznitelik isimleri ile veri türlerinin bir listesi olarak
belirtilir. Bu aslında bir tablonun satır türü ile
aynıdır, fakat bir tür tanımlanmak
istendiğinde
CREATE TYPE kullanarak gerçek bir tablo
oluşturma ihtiyacı önlenir. Tek başına bir
bileşik tür bir işlevin argümanı veya
dönüş türü olarak yararlıdır.
Temel Türler¶
CREATE TYPE'ın ikinci biçimi yeni bir temel tür
oluşturur. Parametrelerin yukarıdaki sırayla
belirtilmeleri şart değildir, herhangi bir sırayla
belirtilebilirler, ayrıca çoğu isteğe
bağlıdır. Bir türü tanımlamadan
önce
CREATE FUNCTION kullanarak iki veya daha fazla işlev
tanımlanmış olmalıdır. Destek
işlevleri olan
girdi_işlevi ve
çıktı_işlevi zorunludur.
alış_işlevi,
gönderim_işlevi
ve
analiz_işlevi ise isteğe
bağlıdır. Genelde bu işlevler C gibi
düşük seviyeli bir dille yazılırlar.
girdi_işlevi türün harici metin gösterimini,
bu türü kullanmak için tanımlanmış
işleç ve işlevler tarafından kullanılan
dahili gösterime çevirir.
çıktı_işlevi ise bunun tersini yapar. Girdi
işlevi ya cstring türünde tek bir argüman alacak
şekilde ya da cstring, oid ve integer türünde
üç argüman alacak şekilde bildirilebilir.
İlk argüman, bir C dizgesi olarak girdi metnidir. İkinci
argüman, tür bir dizi ise dizi elemanlarının nesne
kimliği, bir bileşik tür ise türün kendi
nesne kimliğidir. Üçüncüsü ise,
biliniyorsa, hedef sütunun typmod'u, bilinmiyorsa -1'dir. Girdi
işlevi yeni veri türünde bir değer ile
dönmelidir. Çıktı işlevi ya yeni veri
türünde tek bir argüman alacak şekilde ya da
ikincisi oid türünde iki argüman alacak şekilde
bildirilebilir. İkinci argüman yine, tür bir dizi ise
dizi elemanlarının nesne kimliği, bir bileşik
tür ise türün kendi nesne kimliğidir.
Çıktı işlevi cstring türünde bir
değer ile dönmelidir.
İsteğe bağlı olan
alış_işlevi türün harici ikilik
gösterimini dahili gösterime çevirir. Eğer bu
işlev yoksa, tür ikilik çıktıda rol alamaz.
İkilik gösterim oldukça taşınabilir
olmanın yanı sıra dahil gösterime
dönüşümde ucuz olmalıdır.
(Örneğin, standart tamsayı veri türlerinin harici
ikilik gösterimleri ağ bayt sıralamasındayken,
dahili gösterimleri makinenin doğal bayt
sıralamasındadır.) Alış işlevi
değerin geçerliliğinden emin olmayı
sağlayacak kadar sınama yapmalıdır.
Alış işlevi ya internal türünde tek bir
argüman alacak şekilde ya da internal ve oid
türünde iki argüman alacak şekilde bildirilebilir.
İşlev yeni veri türünde bir değer ile
dönmelidir. İlk argüman alınan bayt dizgesini
tutacak bir StringInfo tamponuna bir göstericidir. İkinci
argüman, tür bir dizi ise dizi elemanlarının nesne
kimliği, bir bileşik tür ise türün kendi
nesne kimliğidir. Benzer şekilde, isteğe
bağlı olan
gönderim_işlevi
türün dahili gösterimini harici ikilik gösterime
çevirir. Gönderim işlevi ya yeni veri
türünde tek bir argüman alacak şekilde ya da
ikincisi oid türünde iki argüman alacak şekilde
bildirilebilir. İkinci argüman yine, tür bir dizi ise
dizi elemanlarının nesne kimliği, bir bileşik
tür ise türün kendi nesne kimliğidir.
Gönderim işlevi bytea türünde bir değer ile
dönmelidir.
Girdi ve çıktı işlevlerinin yeni tür
oluşturulmadan önce yeni türde argümanlar ve veri
türleri ile bildirimlerinin nasıl
yapılacağı noktasında dikkatli
olmalısınız. Bunun yanıtı, önce
girdi işlevinin sonra da çıktı işlevinin
(ve isteniyorsa, ikilik G/Ç işlevlerinin)
oluşturulması, son olarak veri türünün
tanımlanması olacaktır. PostgreSQL yeni veri
türünün ismini ilk defa girdi işlevinin
dönüş türü olarak görecek, sistem
kataloğunda basitçe yer tutucu girdi olarak bir kabuk
türü ayıracak ve girdi işlevinin
tanımını kabuk türüne ilintileyecektir.
Benzer şekilde diğer işlevleri de (artık mevcut
olan) kabuk türüne ilintileyecektir. Son olarak,
CREATE
TYPE, kabuk girdisi ile tam tür tanımını yer
değiştirir ve yeni tür kullanılabilir olur.
İsteğe bağlı olan
analiz_işlevi, veri
türündeki sütunlar için türe
özgü istatistikleri hesaplar. Öntanımlı
olarak,
ANALYZE eğer tür için
öntanımlı bir b-tree işleç
sınıfı varsa, türün eşittir ve
küçüktür işleçlerini kullanarak
istatistikleri toplamaya çalışacaktır.
Bileşik türlerde bu davranış elverişsiz
olabilir, bu sorun özel bir analiz işlevi belirterek
aşılabilir. Analiz işlevi internal türünde
tek bir argüman alacak şekilde bildirilmeli ve boolean
türünde bir sonuçla dönmelidir. Analiz
işlevlerinin ayrıntılı uygulama
arayüzü src/include/commands/vacuum.h dosyasında
görülebilir.
Yeni türün dahili gösteriminin
ayrıntıları sadece G/Ç işlevleri ve bu
türle çalışmak üzere sizin
tanımladığınız işlevlerce bilinir;
dahili gösteriminin bazı özelliklerinin PostgreSQL'e
ayrıca bildirilmesi gerekir. Bunların en önemlisi
dahili_uzunluk'tur. Temel veri türleri,
dahili_uzunluk
bir pozitif tamsayı olarak verildiğinde sabit uzunlukta
olabileceği gibi,
dahili_uzunluk olarak
VARIABLE
belirtildiğinde değişken uzuklukta da olabilir (bu dahili
olarak typlen'e -1 atanarak yapılır). Değişken
uzunluklu tüm veri türleri, türün değerinin
toplam uzunluğunu gösteren 4 baytlık bir tamsayı
ile başlamalıdır.
İsteğe bağlı olan
PASSEDBYVALUE
seçeneği bu veri türünün
gösterilerek değil değeri ile
aktarılacağını belirtir. Dahili
gösterimleri Datum türünün
genişliğinden (çoğu makinede 4,
birkaçında 8 bayttır) daha büyük veri
türlerini değeri ile aktaramazsınız.
hizalama parametresi ile belleğin ne uzunlukta adımlanarak
veri türünün yerletirileceği belirtilir.
İzin verilen adım uzunlukları 1, 2, 4 veya 8
bayttır. Değişken uzunluklu veri türleri
için, ilk eleman bir int4 olduğundan en az 4 baytlık
adım uzunluğu belirtilmelidir.
strateji parametresi ile değişken uzunluklu veri
türlerinin saklama stratejilerinin seçimi mümkün
olur. (Sabit uzunluklu türlerde sadece plain
mümkündür.) plain ile değerin daima olduğu
gibi sıkıştırılmadan
saklanacağı; extended ile, değer çok uzunsa
önce sıkıştırılmaya
çalışılacağı, yine de uzunsa, ana
tablo dışına taşınacağı;
external ile, değerin ana tablo dışına
taşınacağı, fakat sistemin değeri
sıkıştırmaya
çalışmayacağı; main ile,
sıkıştırma yapılacağı ama
değerin ana tablo dışına
taşınmasının engelleneceği belirtilir. main
saklama stratejisinde, değeri tablo satırı içinde
saklamanın bir yolu yoksa, değer yine de ana tablo
dışına taşınabilir, fakat değerin
ana tabloda tutulması bakımından böyle bir
öğe extended ve external öğelere göre daha
ayrıcalıklıdır.
Kullanıcının sütunlarda NULL değer istememesi
durumunda
DEFAULT seçeneği ile bir
öntanımlı değer belirtilebilir. (Böyle bir
öntanımlı değer bir sütuna
açıkça iliştirilen bir
DEFAULT ile o
sütun için değiştirilebilir.)
Türün bir dizi olduğu, dizi elemanları
ELEMENT seçeneği kullanılarak belirtilebilir.
Örneğin, 4 baytlık tamsayılardan (int4)
oluşan bir dizi tanımlamak için, seçenek
ELEMENT = int4 şeklinde belirtilir. Dizi türler
aşağıda ayrıntılı olarak
açıklanmıştır.
Bu türün dizisinin harici gösteriminde kullanmak
üzere
ayraç olarak belli bir karakter belirtilebilir.
Öntanımlı ayraç virgüldür.
Yalnız, burada belirtilen ayraç dizi türle değil,
dizi elemanının türüyle ilgilidir.
Dizi Türler¶
Bir kullanıcı tanımlı temel veri
türünün her oluşturuluşunda, PostgreSQL bu
veri türünün dizi türünü
kendiliğinden oluşturur ve bu veri
türününün ismini temel veri türü
isminin başına bir alt çizgi ekleyerek oluşturur.
Çözümleyici bu uzlaşımı bilir ve
foo[] gibi bir türdeki sütun isteklerini _foo
türündeki isteklere
dönüştürür. Dolaylı
oluşturulan dizi türü değişken uzunlukludur
ve yerleşik girdi ve çıktı işlevleri olan
array_in ve array_out işlevlerini kullanır.
Madem sistem doğru dizi türünü kendiliğinden
oluşturuyor,
ELEMENT diye bir seçenek niçin var
diyebilirsiniz.
ELEMENT kullanmanın yararlı olduğu
tek durum, dahili olarak aynı türde şeylerin bir dizisi
olmak üzere bir sabit uzunluklu tür tanımlayıp,
hem bu türün tamamı üzerinde hem de bu
şeylere indisleriyle doğrudan erişerek bazı
işlemler yapabilmek istenmesi durumudur. Örneğin, name
türünün char elemanlarına bu yöntemle
erişmek mümkündür. Bir iki boyutlu tür olan
point türünün iki elemanına point[0] ve point[1]
şeklinde erişmek mümkündür. Dahili
biçim, eş sabit uzunluklu alanlardan oluştuğundan,
bu oluşum sadece sabit uzunluklu türler için
geçerlidir. İndislenebilir bir değişken uzunluklu
tür, array_in ve array_out tarafından kullanılan
genelleştirilmiş dahili gösterime sahip
olmalıdır. Tarihi sebeplerle (bu aslında doğru
değil, asıl sebep bunu değiştirmek için
geç kalınmış olmasıdır), sabit
uzunluklu dizilerin indislemesi sıfırdan başlarken,
değişken uzunluklu dizilerde birden başlar.
PARAMETRELER¶
- isim
- Oluşturulacak türün ismi (şema nitelemeli
olabilir).
- öznitelik_ismi
- Bileşik tür için bir öznitelik (sütun)
ismi.
- veri_türü
- Bileşik türü oluşturmak üzere bir
sütun veri türü olarak mevcut bir türün
ismi.
- girdi_işlevi
- Türün harici metin gösterimini dahili
gösterime çeviren işlevin ismi.
- çıktı_işlevi
- Türün dahili gösterimini harici metin
gösterimine çeviren işlevin ismi.
- alış_işlevi
- Türün harici ikilik gösterimini dahili
gösterime çeviren işlevin ismi.
- gönderim_işlevi
- Türün dahili gösterimini harici ikilik
gösterime çeviren işlevin ismi.
- analiz_işlevi
- Veri türü için istatistiksel analizler yapan
işlevin ismi.
- dahili_uzunluk
- Yeni türün dahili gösteriminin bayt cinsinden
uzunluğunu belirten sayısal sabit.
Öntanımlı değer türün
değişken uzunluklu olacağı kabulüne
dayanır.
- hizalama
- Belleğin ne uzunlukta adımlanarak veri
türünün yerletirileceği belirtilir.
Belirtilmesi gerekliyse, char, int2, int4, ya da double olabilir. int4
öntanımlıdır.
- strateji
- Değişken uzunluklu veri türlerinin saklama
stratejisi. Belirtilmesi gerekliyse, plain, external, extended veya main
olabilir. plain öntanımlıdır.
- öntanımlı
- Veri türü için öntanımlı
değer. Belirtilmezse NULL öntanımlıdır.
- öğe_türü
- Belirtilirse türü bir dizi yapar; bu, dizi
elemanının veri türü olmalıdır.
- ayraç
- Bu türün harici dizi gösteriminde kullanılacak
ayraç karakteri.
EK BİLGݶ
Kullanıcı tanımlı türlerin isimleri
altçizgi (_) karakteri ile başlayamaz ve ençok 62
karakter uzunlukta (veya daha genel olarak, NAMEDATALEN - 2; tür ismi
dışında bütün isimler için
NAMEDATALEN - 1) olabilir. Altçizgi ile başlayan tür
isimleri dahili olarak oluşturulan dizi tür isimleri için
ayrılmıştır.
7.3 öncesi PostgreSQL sürümlerinde, işlevlerin
opaque türde yer tutuculu tür isimlerine ileri
başvuruları ile yer değiştirmek üzere bir
kabuk türü oluşturmaktan kaçınmak
alışılmış bir durumdu. Ayrıca, 7.3
öncesinde, cstring argüman ve dönüş
türlerinin opaque olarak bildirilmeleri zorunluydu. Eski
döküm dosyalarını desteklemek için,
CREATE TYPE opaque kullanılarak bildirilmiş
işlevleri kabul edecek, fakat işlevin bildiriminin doğru
tür kullanılacak şekilde değiştirilmesi
hususunda bir uyarı çıktılayacaktır.
ÖRNEKLER¶
Bir bileşik türün oluşturulması ve bir
işlev tanımında kullanılması:
CREATE TYPE compfoo AS (f1 int, f2 text);
CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$
SELECT fooid, fooname FROM foo
$$ LANGUAGE SQL;
box isminde bir temel veri türünün
oluşturulması ve bir tablo tanımında
kullanılması:
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function
);
CREATE TABLE myboxes (
id integer,
description box
);
box türünün dahili yapısı float4
türünde 4 elemanlı bir dizi ise:
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function,
ELEMENT = float4
);
Bu şekilde, box türündeki değerin
elemanlarına indisleri ile erişilebileceği gibi,
tür yukarıdaki gibi de davranır.
Büyük bir nesne türü oluşturulması ve
bir tablo tanımında kullanılması:
CREATE TYPE bigobj (
INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
id integer,
obj bigobj
);
Girdi ve çıktı işlevleri dahil daha fazla
örneği,
http://www.postgresql.org/docs/8.0/static/xtypes.html adresinde bulabilirsiniz.
UYUMLULUK¶
Bu
CREATE TYPE bir PostgreSQL oluşumudur. SQL:1999 ve sonraki
standartlarda da bir
CREATE TYPE vardır ama
ayrıntıda daha farklıdır.
İLGİLİ BELGELER¶
CREATE FUNCTION [
create_function(7)],
DROP TYPE [
drop_type(7)],
ALTER TYPE [
alter_type(7)].
ÇEVİREN¶
Nilgün Belma Bugüner <nilgun (at)
belgeler·gen·tr>, Nisan 2005