Provided by: manpages-tr_1.0.5.1-2_all 

İ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
PostgreSQL CREATE TYPE(7)