İ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