İSİM¶
CREATE CAST - iki veri türü arasında yeni bir
dönüşüm tanımlar
KULLANIM¶
CREATE CAST (kaynak_tür AS hedef_tür)
WITH FUNCTION işlev_ismi (arg_türü)
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (kaynak_tür AS hedef_tür)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
AÇIKLAMA¶
CREATE CAST iki veri türü arasında yeni bir
dönüşüm tanımlar. Örnek:
SELECT CAST(42 AS text);
Burada 42 tamsayı sabiti evvelce tanımlanmış bir
işlev (text(int4) işlevi) çağrılarak text
türüne dönüştürülmektedir.
(Eğer böyle bir tür
dönüşümü
tanımlanmamışsa, dönüşüm
başarısız olur.)
İki tür
ikilik olarak uyumlu olabilir, yani herhangi bir
işlev çağrılmadan serbestçe bir
türden diğer türe
dönüştürülebilir. Bu ilgili
değerlerin aynı dahili gösterime sahip
olmalarını gerektirir. Örneğin, text ve varchar
türleri ikilik olarak uyumlu türlerdir (ya da dahili
gösterimleri aynı olan türlerdir).
Öntanımlı olarak, bir tür
dönüşümü sadece
CAST(
x AS
tür_ismi) veya
x::
tür_ismi gibi
doğrudan bir tür dönüşüm
isteği ile yapılabilir.
Eğer tür dönüşümü
AS
ASSIGNMENT ile tanımlanmışsa, bir sütuna hedef
veri türünde atama şeklinde örtük olarak
çağrılabilir. Örneğin, foo.f1'nin text
türünde bir sütun olduğunu varsayalım,
INSERT INTO foo (f1) VALUES (42);
eğer integer türünden text türüne
dönüşüm
AS ASSIGNMENT imli olarak
oluşturulmuşsa, bu dönüşüm
mümkün olur, yoksa olmaz. (Böyle tür
dönüşümlerine genellikle,
atamalı
tür dönüşümü diyoruz.)
Eğer tür dönüşümü
AS
IMPLICIT ile oluşturulmuşsa, herhangi bir bağlam
içinde, sadece atama ile değil, bir ifadenin içinde
kullanıldığında bile dolaylı olarak
böyle bir tür dönüşümü
yapılabilir. Örneğin, || işleci text
türünde terimler aldığından,
SELECT 'The time is ' || now();
eğer timestamp türünden text türüne
dönüşüm
AS IMPLICIT imli olarak
oluşturulmuşsa, bu dönüşüm
mümkün olur. Aksi takdirde tür
dönüşümünün doğrudan
yazılması gerekir. Örnek:
SELECT 'The time is ' || CAST(now() AS text);
(Böyle tür dönüşümlerine genellikle,
dolaylı tür dönüşümü
diyoruz.)
Tür dönüşümlerini dolaylı olarak
yapılması için imlerken biraz tutucu olmakta fayda
vardır. Dolaylı dönüşümde bir
aşırı bolluk, çok sayıda yorumun
mümkün olması nedeniyle, PostgreSQL'in
şaşırtıcı komut yorumları
seçmesine ya da komutları tamamen
çözümleyememesine sebep olabilir. En iyisi sadece
aynı genel tür kategorisindeki türler arasında
bilgi koruyan dönüşümler için
dolaylı olarak çağrılabilen bir tür
dönüşümü yapmaktır.
Örneğin, int2'den int4'e tür
dönüşümünün dolaylı
olması kabul edilebilir, fakat float8'den int4'e
dönüşüm şüphesiz atama yoluyla
yapılmalıdır. text'den int4'e tür
dönüşümü gibi farklı tür
kategorileri arasındaki tür
dönüşümünü
açıkça belirterek yapmak en iyisidir.
Bir tür dönüşümünün
mümkün olması için kendi kaynak ve hedef veri
türleriniz olmalıdır. İkilik olarak uyumlu
tür dönüşümü oluşturabilmek
için ise ayrıcalıklı kullanıcı
olmalısınız. (Bu kısıtlamanın
sebebi, hatalı yapılan ikilik uyumlu tür
dönüşümlerinin sunucunun kolayca
çökmesine sebep olmasıdır.)
PARAMETRELER¶
- kaynak_tür
- Tür dönüşümünün kaynak
veri türünün ismi.
- hedef_tür
- Tür dönüşümünün hedef
veri türünün ismi.
- işlev_ismi(arg_türü)
- Tür dönüşümünü
gerçekleştirecek işlev. İşlevin ismi
şema nitelemeli olabilir; değilse, işlev şema
arama yolunda aranacaktır. İşlevin sonuç veri
türü tür
dönüşümünün hedef veri
türü ile eşleşmelidir. Argümanlar
aşağıda
açıklanmıştır.
- WITHOUT FUNCTION
- Kaynak ve hedef türlerin ikilik olarak uyumlu olduğunu
belirtir, böylece tür
dönüşümünü
gerçekleştirmek için bir işleve gerek kalmaz.
- AS ASSIGNMENT
- Tür dönüşümünün atama
bağlamında dolaylı olarak uygulanabileceğini
belirtir.
- AS IMPLICIT
- Tür dönüşümünün herhangi
bir bağlamda dolaylı olarak uygulanabileceğini
belirtir.
Tür dönüşümü gerçekleme
işlevleri bir, iki ya da üç argümanlı
olabilir. İlk argümanın türü tür
dönüşümünün kaynak veri
türü ile aynı olmalıdır. Varsa, ikinci
argüman integer türünde olmalıdır; hedef
türle ilgili tür
dönüştürücüyü, yoksa -1
değerini alır. Varsa, üçüncü
argüman boolean türünde olmalıdır;
dönüşüm açıkça belirtilerek
uygulanacaksa true, aksi takdirde false değerini alır. (Tuhaf
bir biçimde, SQL belirtimi bazı durumlarda, doğrudan ve
dolaylı tür dönüşümleri için
farklı davranışlar talep eder. Bu argüman
böyle tür dönüşümlerini
gerçekleştirmesi istenen işlevler için
sağlanmıştır. Kendi veri türlerinizi buna
konu olacak şekilde tasarlamanız tavsiye edilmez.)
Normal olarak bir tür dönüşümü
farklı kaynak ve hedef veri türlerine sahip
olmalıdır. Yine de, dönüşümü
gerçekleştirecek işlevin birden fazla
argümanı olması durumunda, kaynak ve hedef veri
türleri aynı olan tür
dönüşümü bildirimlerine izin verilir. Bu,
sistem kataloglarında türe özel uzunluk zorlama
işlevlerini ifade etmekte kullanılır. İsimli
işlev, tür değerini ikinci argümanında
belirtilen tür değiştirici değerine zorlamak
için kullanılır. (Dil kuralları sadece belli
yerleşik veri türlerinin tür
değiştiricilere sahip olmasına izin verdiğinden,
bu özellik kullanıcı tanımlı hedef
türlerde kullanmak için değildir, burada
bütünlüğü sağlamak için
bahsettik.)
Bir tür dönüşümü farklı kaynak
ve hedef türleri ile birden fazla argüman alan bir işleve
sahip olduğunda, bir türden diğer türe
dönüşümü yaparken aynı adımda
bir uzunluk zorlaması da yapılıyor demektir. Böyle
bir girdi mevcut olmadığı zaman, bir tür
dönüşümü kullanan bir tür
zorlaması iki adım gerektirir; birincisinde veri türleri
arasında dönüşüm yapılır,
ikincisinde tür değiştirici uygulanır.
EK BİLGݶ
Kullanıcı tanımlı bir tür
dönüşümünü kaldırmak
için
DROP CAST [
drop_cast(7)] kullanılır.
Türler arasındaki dönüşümün her
iki yönde de yapılmasını istiyorsanız, her
iki tür dönüşümünü
açıkça bildirmeniz gerektiğini unutmayın.
PostgreSQL 7.3 öncesinde, her işlev bir veri türü
ile aynı ismi alır, bu veri türünü
döndürür ve farklı türde bir argüman
alıp özdevinimli olarak bir tür
dönüşüm işlevi olurdu. Bu
uzlaşım şemaların tanıtımıyla
ve sistem kataloglarında ikilik uyumlu tür
dönüşümlerinin ifade edilebilmesi için
terkedildi. Yerleşik tür dönüşüm
işlevleri hala bu isimleme şemasını
kullanıyor olsa da, pg_cast sistem kataloğunda da tür
dönüşümleri olarak gösterilmiş
olması gerekir.
Gerekli olmadığında, tür
dönüşüm gerçekleme işlevlerinin
hedef veri türünde isimlendirilmesi
uzlaşımını kullanmaya devam etmenizi
öneririz. Çoğu kullanıcı,
türismi(
x) biçiminde veri türlerini
dönüştürmeye
alışmıştır. Bu yazım şekli
aslında bir tür dönüşümü
gerçekleştirme işlevi
çağrısından ne eksik ne de fazladır; bir
tür dönüşümü olarak özellikle
ele alınmaz. Eğer sizin dönüşüm
işlevleriniz bu uzlaşıma uygun olarak
isimlendirilmemişse, siz şaşırtıcı
kullanıcılarsınız demektir. PostgreSQL
farklı argüman türlerine sahip işlevlere
aynı ismin verilmesine izin verdiğinden farklı veri
türlerine dönüşüm için hepsi hedef
veri türünde isimlendirilmiş çok sayıda
dönüşüm işlevine sahip olmanın bir
zorluğu yoktur.
- Bilgi:
- Önceki paragrafta küçük bir zararsız
yalan vardır: pg_cast'ın bir
görünüşte işlev
çağrısının anlamını
çözümlemekte kullanılacağı bir
durum hala vardır. Eğer isim(x) gibi bir
işlev çağrısı aslında bir
işlevle eşleşmiyorsa, fakat isim bir veri
türünün ismiyse ve pg_cast x
türünden bu türe bir ikilik uyumlu tür
dönüşümünü gösteriyorsa,
çağrı bir açıkça tür
dönüşümü olarak yorumlanacaktır.
İkilik olarak uyumlu tür
dönüşümleri bir işleve
karşılık olmasalar bile işlevsel
sözdizimi kullanılarak
çağrılabileceğinden böyle bir
olağandışılık vardır.
ÖRNEKLER¶
int4(text) işlevini kullanarak text türünden int4
türüne bir tür
dönüşümü oluşturmak için:
CREATE CAST (text AS int4) WITH FUNCTION int4(text);
(Bu tür dönüşümü sistemde zaten
önceden tanımlanmıştır.)
UYUMLULUK¶
SQL:1999'un ikilik uyumlu türler veya gerçekleme
işlevlerinin ek argümanlarını hesaba
katmaması dışında,
CREATE CAST SQL:1999 ile
uyumludur.
AS IMPLICIT de bir PostgreSQL oluşumudur.
SEE ALSO¶
CREATE FUNCTION [
create_function(7)],
CREATE TYPE
[
create_type(7)],
DROP CAST [
drop_cast(7)].
ÇEVİREN¶
Nilgün Belma Bugüner <nilgun (at)
belgeler·gen·tr>, Nisan 2005