Provided by: manpages-tr_1.0.5.1-2_all bug

İ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