Provided by:
manpages-tr_1.0.5.1-2_all 
ISIM
CREATE TYPE - yeni bir veri turu tanimlar
KULLANIM
CREATE TYPE isim AS
( "oznitelik_ismi veri_t"ur"u [, ... ] )
CREATE TYPE isim (
INPUT = girdi_i,slevi,
OUTPUT = ,cikti_i,slevi
[ , RECEIVE = ali,s_i,slevi ]
[ , SEND = g"onderim_i,slevi ]
[ , ANALYZE = analiz_i,slevi ]
[ , INTERNALLENGTH = { dahili_uzunluk | VARIABLE } ]
[ , PASSEDBYVALUE ]
[ , ALIGNMENT = hizalama ]
[ , STORAGE = strateji ]
[ , DEFAULT = "ontanimli ]
[ , ELEMENT = "oge_t"ur"u ]
[ , DELIMITER = ayra,c ]
)
A,CIKLAMA
CREATE TYPE o anki veritabaninda kullanmak icin yeni bir veri turu
tanimlar. Turu tanimlayan kullanici turun sahibi haline gelir.
Eger bir sema ismi belirtilmisse, tur bu semada olusturulur. Aksi
takdirde, tur o anki semada olusturulur. Tur ismi ayni sema icinde
mevcut veri turu ve veri alani isimlerinden farkli olmalidir. (Tablolar
iliskili veri turlerine sahip oldugundan, tur ismi ayrica, ayni semada
mevcut tablo isimlerinden de farkli olmalidir.)
Bile,sik T"urler
CREATE TYPE'in ilk bicimi bir bilesik veri turu olusturur. Bilesik tur,
oznitelik isimleri ile veri turlerinin bir listesi olarak belirtilir.
Bu aslinda bir tablonun satir turu ile aynidir, fakat bir tur
tanimlanmak istendiginde CREATE TYPE kullanarak gercek bir tablo
olusturma ihtiyaci onlenir. Tek basina bir bilesik tur bir islevin
argumani veya donus turu olarak yararlidir.
Temel T"urler
CREATE TYPE'in ikinci bicimi yeni bir temel tur olusturur.
Parametrelerin yukaridaki sirayla belirtilmeleri sart degildir,
herhangi bir sirayla belirtilebilirler, ayrica cogu istege baglidir.
Bir turu tanimlamadan once CREATE FUNCTION kullanarak iki veya daha
fazla islev tanimlanmis olmalidir. Destek islevleri olan girdi_i,slevi
ve ,cikti_i,slevi zorunludur. ali,s_i,slevi, g"onderim_i,slevi ve
analiz_i,slevi ise istege baglidir. Genelde bu islevler C gibi dusuk
seviyeli bir dille yazilirlar.
girdi_i,slevi turun harici metin gosterimini, bu turu kullanmak icin
tanimlanmis islec ve islevler tarafindan kullanilan dahili gosterime
cevirir. ,cikti_i,slevi ise bunun tersini yapar. Girdi islevi ya cstring
turunde tek bir arguman alacak sekilde ya da cstring, oid ve integer
turunde uc arguman alacak sekilde bildirilebilir. Ilk arguman, bir C
dizgesi olarak girdi metnidir. Ikinci arguman, tur bir dizi ise dizi
elemanlarinin nesne kimligi, bir bilesik tur ise turun kendi nesne
kimligidir. Ucuncusu ise, biliniyorsa, hedef sutunun typmod'u,
bilinmiyorsa -1'dir. Girdi islevi yeni veri turunde bir deger ile
donmelidir. Cikti islevi ya yeni veri turunde tek bir arguman alacak
sekilde ya da ikincisi oid turunde iki arguman alacak sekilde
bildirilebilir. Ikinci arguman yine, tur bir dizi ise dizi
elemanlarinin nesne kimligi, bir bilesik tur ise turun kendi nesne
kimligidir. Cikti islevi cstring turunde bir deger ile donmelidir.
Istege bagli olan ali,s_i,slevi turun harici ikilik gosterimini dahili
gosterime cevirir. Eger bu islev yoksa, tur ikilik ciktida rol alamaz.
Ikilik gosterim oldukca tasinabilir olmanin yani sira dahil gosterime
donusumde ucuz olmalidir. (Ornegin, standart tamsayi veri turlerinin
harici ikilik gosterimleri ag bayt siralamasindayken, dahili
gosterimleri makinenin dogal bayt siralamasindadir.) Alis islevi
degerin gecerliliginden emin olmayi saglayacak kadar sinama yapmalidir.
Alis islevi ya internal turunde tek bir arguman alacak sekilde ya da
internal ve oid turunde iki arguman alacak sekilde bildirilebilir.
Islev yeni veri turunde bir deger ile donmelidir. Ilk arguman alinan
bayt dizgesini tutacak bir StringInfo tamponuna bir gostericidir.
Ikinci arguman, tur bir dizi ise dizi elemanlarinin nesne kimligi, bir
bilesik tur ise turun kendi nesne kimligidir. Benzer sekilde, istege
bagli olan g"onderim_i,slevi turun dahili gosterimini harici ikilik
gosterime cevirir. Gonderim islevi ya yeni veri turunde tek bir arguman
alacak sekilde ya da ikincisi oid turunde iki arguman alacak sekilde
bildirilebilir. Ikinci arguman yine, tur bir dizi ise dizi
elemanlarinin nesne kimligi, bir bilesik tur ise turun kendi nesne
kimligidir. Gonderim islevi bytea turunde bir deger ile donmelidir.
Girdi ve cikti islevlerinin yeni tur olusturulmadan once yeni turde
argumanlar ve veri turleri ile bildirimlerinin nasil yapilacagi
noktasinda dikkatli olmalisiniz. Bunun yaniti, once girdi islevinin
sonra da cikti islevinin (ve isteniyorsa, ikilik G/C islevlerinin)
olusturulmasi, son olarak veri turunun tanimlanmasi olacaktir.
PostgreSQL yeni veri turunun ismini ilk defa girdi islevinin donus turu
olarak gorecek, sistem katalogunda basitce yer tutucu girdi olarak bir
kabuk turu ayiracak ve girdi islevinin tanimini kabuk turune
ilintileyecektir. Benzer sekilde diger islevleri de (artik mevcut olan)
kabuk turune ilintileyecektir. Son olarak, CREATE TYPE, kabuk girdisi
ile tam tur tanimini yer degistirir ve yeni tur kullanilabilir olur.
Istege bagli olan analiz_i,slevi, veri turundeki sutunlar icin ture ozgu
istatistikleri hesaplar. Ontanimli olarak, ANALYZE eger tur icin
ontanimli bir b-tree islec sinifi varsa, turun esittir ve kucuktur
isleclerini kullanarak istatistikleri toplamaya calisacaktir. Bilesik
turlerde bu davranis elverissiz olabilir, bu sorun ozel bir analiz
islevi belirterek asilabilir. Analiz islevi internal turunde tek bir
arguman alacak sekilde bildirilmeli ve boolean turunde bir sonucla
donmelidir. Analiz islevlerinin ayrintili uygulama arayuzu
src/include/commands/vacuum.h dosyasinda gorulebilir.
Yeni turun dahili gosteriminin ayrintilari sadece G/C islevleri ve bu
turle calismak uzere sizin tanimladiginiz islevlerce bilinir; dahili
gosteriminin bazi ozelliklerinin PostgreSQL'e ayrica bildirilmesi
gerekir. Bunlarin en onemlisi dahili_uzunluk'tur. Temel veri turleri,
dahili_uzunluk bir pozitif tamsayi olarak verildiginde sabit uzunlukta
olabilecegi gibi, dahili_uzunluk olarak VARIABLE belirtildiginde
degisken uzuklukta da olabilir (bu dahili olarak typlen'e -1 atanarak
yapilir). Degisken uzunluklu tum veri turleri, turun degerinin toplam
uzunlugunu gosteren 4 baytlik bir tamsayi ile baslamalidir.
Istege bagli olan PASSEDBYVALUE secenegi bu veri turunun gosterilerek
degil degeri ile aktarilacagini belirtir. Dahili gosterimleri Datum
turunun genisliginden (cogu makinede 4, birkacinda 8 bayttir) daha
buyuk veri turlerini degeri ile aktaramazsiniz.
hizalama parametresi ile bellegin ne uzunlukta adimlanarak veri turunun
yerletirilecegi belirtilir. Izin verilen adim uzunluklari 1, 2, 4 veya
8 bayttir. Degisken uzunluklu veri turleri icin, ilk eleman bir int4
oldugundan en az 4 baytlik adim uzunlugu belirtilmelidir.
strateji parametresi ile degisken uzunluklu veri turlerinin saklama
stratejilerinin secimi mumkun olur. (Sabit uzunluklu turlerde sadece
plain mumkundur.) plain ile degerin daima oldugu gibi sikistirilmadan
saklanacagi; extended ile, deger cok uzunsa once sikistirilmaya
calisilacagi, yine de uzunsa, ana tablo disina tasinacagi; external
ile, degerin ana tablo disina tasinacagi, fakat sistemin degeri
sikistirmaya calismayacagi; main ile, sikistirma yapilacagi ama degerin
ana tablo disina tasinmasinin engellenecegi belirtilir. main saklama
stratejisinde, degeri tablo satiri icinde saklamanin bir yolu yoksa,
deger yine de ana tablo disina tasinabilir, fakat degerin ana tabloda
tutulmasi bakimindan boyle bir oge extended ve external ogelere gore
daha ayricaliklidir.
Kullanicinin sutunlarda NULL deger istememesi durumunda DEFAULT
secenegi ile bir ontanimli deger belirtilebilir. (Boyle bir ontanimli
deger bir sutuna acikca ilistirilen bir DEFAULT ile o sutun icin
degistirilebilir.)
Turun bir dizi oldugu, dizi elemanlari ELEMENT secenegi kullanilarak
belirtilebilir. Ornegin, 4 baytlik tamsayilardan (int4) olusan bir dizi
tanimlamak icin, secenek ELEMENT = int4 seklinde belirtilir. Dizi
turler asagida ayrintili olarak aciklanmistir.
Bu turun dizisinin harici gosteriminde kullanmak uzere ayra,c olarak
belli bir karakter belirtilebilir. Ontanimli ayrac virguldur. Yalniz,
burada belirtilen ayrac dizi turle degil, dizi elemaninin turuyle
ilgilidir.
Dizi T"urler
Bir kullanici tanimli temel veri turunun her olusturulusunda,
PostgreSQL bu veri turunun dizi turunu kendiliginden olusturur ve bu
veri turununun ismini temel veri turu isminin basina bir alt cizgi
ekleyerek olusturur. Cozumleyici bu uzlasimi bilir ve foo[] gibi bir
turdeki sutun isteklerini _foo turundeki isteklere donusturur. Dolayli
olusturulan dizi turu degisken uzunlukludur ve yerlesik girdi ve cikti
islevleri olan array_in ve array_out islevlerini kullanir.
Madem sistem dogru dizi turunu kendiliginden olusturuyor, ELEMENT diye
bir secenek nicin var diyebilirsiniz. ELEMENT kullanmanin yararli
oldugu tek durum, dahili olarak ayni turde seylerin bir dizisi olmak
uzere bir sabit uzunluklu tur tanimlayip, hem bu turun tamami uzerinde
hem de bu seylere indisleriyle dogrudan eriserek bazi islemler
yapabilmek istenmesi durumudur. Ornegin, name turunun char elemanlarina
bu yontemle erismek mumkundur. Bir iki boyutlu tur olan point turunun
iki elemanina point[0] ve point[1] seklinde erismek mumkundur. Dahili
bicim, es sabit uzunluklu alanlardan olustugundan, bu olusum sadece
sabit uzunluklu turler icin gecerlidir. Indislenebilir bir degisken
uzunluklu tur, array_in ve array_out tarafindan kullanilan
genellestirilmis dahili gosterime sahip olmalidir. Tarihi sebeplerle
(bu aslinda dogru degil, asil sebep bunu degistirmek icin gec kalinmis
olmasidir), sabit uzunluklu dizilerin indislemesi sifirdan baslarken,
degisken uzunluklu dizilerde birden baslar.
PARAMETRELER
isim Olusturulacak turun ismi (sema nitelemeli olabilir).
"oznitelik_ismi
Bilesik tur icin bir oznitelik (sutun) ismi.
veri_t"ur"u
Bilesik turu olusturmak uzere bir sutun veri turu olarak mevcut
bir turun ismi.
girdi_i,slevi
Turun harici metin gosterimini dahili gosterime ceviren islevin
ismi.
,cikti_i,slevi
Turun dahili gosterimini harici metin gosterimine ceviren
islevin ismi.
ali,s_i,slevi
Turun harici ikilik gosterimini dahili gosterime ceviren islevin
ismi.
g"onderim_i,slevi
Turun dahili gosterimini harici ikilik gosterime ceviren islevin
ismi.
analiz_i,slevi
Veri turu icin istatistiksel analizler yapan islevin ismi.
dahili_uzunluk
Yeni turun dahili gosteriminin bayt cinsinden uzunlugunu
belirten sayisal sabit. Ontanimli deger turun degisken uzunluklu
olacagi kabulune dayanir.
hizalama
Bellegin ne uzunlukta adimlanarak veri turunun yerletirilecegi
belirtilir. Belirtilmesi gerekliyse, char, int2, int4, ya da
double olabilir. int4 ontanimlidir.
strateji
Degisken uzunluklu veri turlerinin saklama stratejisi.
Belirtilmesi gerekliyse, plain, external, extended veya main
olabilir. plain ontanimlidir.
"ontanimli
Veri turu icin ontanimli deger. Belirtilmezse NULL ontanimlidir.
"oge_t"ur"u
Belirtilirse turu bir dizi yapar; bu, dizi elemaninin veri turu
olmalidir.
ayra,c Bu turun harici dizi gosteriminde kullanilacak ayrac karakteri.
EK BILGI
Kullanici tanimli turlerin isimleri altcizgi (_) karakteri ile
baslayamaz ve encok 62 karakter uzunlukta (veya daha genel olarak,
NAMEDATALEN - 2; tur ismi disinda butun isimler icin NAMEDATALEN - 1)
olabilir. Altcizgi ile baslayan tur isimleri dahili olarak olusturulan
dizi tur isimleri icin ayrilmistir.
7.3 oncesi PostgreSQL surumlerinde, islevlerin opaque turde yer
tutuculu tur isimlerine ileri basvurulari ile yer degistirmek uzere bir
kabuk turu olusturmaktan kacinmak alisilmis bir durumdu. Ayrica, 7.3
oncesinde, cstring arguman ve donus turlerinin opaque olarak
bildirilmeleri zorunluydu. Eski dokum dosyalarini desteklemek icin,
CREATE TYPE opaque kullanilarak bildirilmis islevleri kabul edecek,
fakat islevin bildiriminin dogru tur kullanilacak sekilde
degistirilmesi hususunda bir uyari ciktilayacaktir.
"ORNEKLER
Bir bilesik turun olusturulmasi ve bir islev taniminda kullanilmasi:
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 turunun olusturulmasi ve bir tablo taniminda
kullanilmasi:
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function
);
CREATE TABLE myboxes (
id integer,
description box
);
box turunun dahili yapisi float4 turunde 4 elemanli bir dizi ise:
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function,
ELEMENT = float4
);
Bu sekilde, box turundeki degerin elemanlarina indisleri ile
erisilebilecegi gibi, tur yukaridaki gibi de davranir.
Buyuk bir nesne turu olusturulmasi ve bir tablo taniminda kullanilmasi:
CREATE TYPE bigobj (
INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
id integer,
obj bigobj
);
Girdi ve cikti islevleri dahil daha fazla ornegi,
http://www.postgresql.org/docs/8.0/static/xtypes.html adresinde
bulabilirsiniz.
UYUMLULUK
Bu CREATE TYPE bir PostgreSQL olusumudur. SQL:1999 ve sonraki
standartlarda da bir CREATE TYPE vardir ama ayrintida daha farklidir.
ILGILI BELGELER
CREATE FUNCTION [create_function(7)], DROP TYPE [drop_type(7)], ALTER
TYPE [alter_type(7)].
,CEVIREN
Nilgun Belma Buguner <nilgun (at) belgeler.gen.tr>, Nisan 2005