4.2 Bir değer bildirilmiş bir yere yazıldığında

<< İç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:

  • değişkene atama: i = <ifade>;
  • select … into :değişken
  • sütuna yazma: INSERT, UPDATE, MERGE
  • yordam/fonksiyon parametresine bağlama

Dö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ğeriNOT_A_NUMBER i integer ← 'abc'
Hedef aralığının dışındaNUMERIC_OVERFLOW i integer ← 3000000000
Bildirilmiş uzunluğa sığmayanSTRING_OVERFLOW varchar(5) ← 10 karakter
Tarih/saat olarak okunamayanCONVERT_ERROR dt date ← 'abc'
Tanımlı dönüşümü olmayan çiftINVALID_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)
Dikkat

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.

4.2.1 Tam sayı hedefe kesirli değer yazılamaz

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 -> 2

Aynı 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