|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 4. Tip uyumluluğu ve dönüşümler > 4.2 Bir değer bildirilmiş bir yere yazıldığında |
Atanabilir bir çift söz konusuysa değer hedefin bildirilmiş tipine dönüştürülür. Bu, dört yazma yolunda da aynı şekilde geçerlidir:
i = <ifade>;select … into :değişkenINSERT, UPDATE, MERGEDönüşümü motorun CAST kodu yapar. Bunun pratik sonucu şudur: örtük dönüşüm ile açık
CAST tanım gereği aynı cevabı verir ve hatalar standardın adlarını taşır.
| Durum | İstisna | Örnek |
|---|---|---|
| Sayı olmayan karakter değeri | NOT_A_NUMBER |
i integer ← 'abc' |
| Hedef aralığının dışında | NUMERIC_OVERFLOW |
i integer ← 3000000000 |
| Bildirilmiş uzunluğa sığmayan | STRING_OVERFLOW |
varchar(5) ← 10 karakter |
| Tarih/saat olarak okunamayan | CONVERT_ERROR |
dt date ← 'abc' |
| Tanımlı dönüşümü olmayan çift | INVALID_TYPE_CONVERSION |
g guid ← 'abc' |
Dönüşüm bildirilmiş ölçeği ve uzunluğu da uygular:
n number(18,4);
n = 1.234567890123; -- n = 1.2346 (bildirilmiş ölçek uygulandı)
s varchar(5);
s = 42; -- s = '42' (sayı metne dönüştü; örtük dönüşüm uyarısı verir, bkz. 4.5)Başarısız bir atama hedefi NULL'a çeker, eski değerinde bırakmaz. Bu bilinçlidir: başarısız bir atamanın gözlemlenebilir tek sonucu “değer atanmadı” olmalıdır, yarı işlenmiş bir değer değil.
Bir uzunluk, konum, indeks, sayaç ya da tam sayı bildirilmiş bir değişken/sütun beklenen yerde kesir taşıyan bir değer geçerli bir çağrı değildir; SQL:2011 buralarda ölçeği sıfır olan bir tam sayı ister. Motor bunu reddeder:
i integer;
i = 1.5; -- INVALID_PARAMETER: "assignment to I requires an integer,
-- and the value has a fraction"
i = 2.0; -- kabul: kural KESİR hakkında, tip hakkında değil -> 2
i = cast(1.5 as integer); -- kabul: yuvarlamayı isteyen açık yol -> 2Aynı kural sütunlara ve parametrelere de uygulanır:
insert into t(k) values (1.5); -- k integer ise INVALID_PARAMETER
left(s, 1.5) -- uzunluk parametresi kesir kabul etmez