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

PostgreSQL                                                                                        CREATE TYPE(7)