2 – PL/SQL Data Types

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Kullandığımız değişkenler, sabitler, parametreler, fonksiyon gibi geriye değer dönen program parçalarının dönüş değerleri vs. için bellek yönetimlerinin nasıl yapılacağı ve karşılaştırma, validasyon gibi işlemler sırasında nasıl işleneceğinin bilinebilmesi için birer veri türüne sahip olmaları gerekmektedir.
PL/SQL içerisinde veri türleri scalar ve composite olmak üzere iki genel türe ayrılmaktadır, bu yazıda PL/SQL ile birlikte kullanılabilecek scalar veri türleri üzerinde duracağım. Composite türler için (collections & records) daha sonra ayrıntılı bir yazı yazacağım.
PL/SQL içerisinde ön tanımlı olarak kullanılabilen veri türleri aşağıdaki ekran görüntüsünde bir kısmını görebileceğiniz SYS.STANDARD package’ı içerisinde bulunmaktadır(package nedir sorusuna da ileriki konularda cevap bulabileceksiniz).

Temel veri türleri olarak bildiğimiz NUMBER, DATE gibi türlerin aslında bir başka türden(base typelar) türemiş olduğuna dikkat edelim, NUMBER NUMBER_BASE tipinden türetilmiş FLOAT ise NUMBER türünün bir subtype’ı olarak tanımlanmıştır.
Veri tiplerini genel iki gruba ayırmıştık, şimdi scalar veri tipleri neler incelemeye başlayalım, genel başlıklar halinde scalar veri türleri;
– Boolean
– Pls_integer & Binary_integer
– Cursor types
– Kullanıcı tanımlı veri türleri
– SQL veri türleri(giriş bölümünde sql – pl/sql ilişkisinin sıkı bir ilişki olduğundan bahsetmiştim,
sql de tanımlı veri türlerini pl/sql de hiç bir çevrime ihtiyaç duymadan kullanabiliyoruz)

Boolean
Mantıksal ifadeler için kullanılan bir veri türüdür, TRUE, FALSE ve NULL değerlerini alabilir.

Degisken_adi BOOLEAN;
Degisken_adi BOOLEAN := TRUE;

Şekillerinde tanımlanabilir.
Tabloda bir column’a boolean tipi verilemez veya bir fetch işlemi ile boolean değişkene değer atanamaz, dbms_output.put_line gibi komut satırına bir şeyler yazdırmak istediğimiz zaman direkt olarak boolan bir değişken kullanamayız. Bir IF veya CASE ifadesi ile boolean değişkenimizin durumunu anlayıp ona uygun karakter ifadeyi kendimiz belirlemeliyiz. TRUE ise “Doğru”, FALSE ise “Yanlış” vb.
Doğru yanlış mantıksal yaklaşımında iki durumdan söz edebiliriz ancak boolan değişkenlerde bir de NULL seçeneği ortaya çıkar, bunu bir soruya cevap verilmemiş gibi düşünebiliriz. Yani siz birisine siyah rengi sevip sevmediğini sordunuz aldığınız cevap severim(TRUE), sevmem(FALSE) olabileceği gibi cevap alamamışta olabilirsiniz bu durum belirsizlik halidir ve NULL olarak değerlendirilir.

Pls_integer & Binary_integer
Bu iki veri türü benzerdir, -2,147,483,648 +2,147,483,647 arası verileri tutabileceğiniz bu değişkeni number yerine tercih etmeniz performans anlamında katkı sağlayacaktır. Aynı zamanda NUMBER değişkenlere göre daha düşük depolama alanı kullanmaktadır. Verdiğim aralığın dışına taşmayacağından emin olduğunuz durumlarda PLS_INTEGER kullanmak daha doğru bir yaklaşım olacaktır. PLS_INTEGER veri türünün NATURAL, POSITIVE, SIGNTYPE, SIMPLE_INTEGER gibi subtypeları var ancak bu adım adım PL/SQL dizisinde bu kadar detaya boğulmayalım.

Kullanıcı Tanımlı Veri Türleri
PL/SQL in esneklik sağlayan ve bence oldukça güzel yanlarından biri kendi veri türlerimizi(subtype) tanımlamamıza izin vermesidir. Tanımladığımız subtype lar scalar veri türlerini base olarak alabileceği gibi daha önce tanımlamış olduğumuz subtypeları da base olarak alabilir. Örneğin CHAR, NUMBER, RECORD tiplerini base alan subtypelar oluşturabiliriz.
Oluşturulabilecek veri türleri;
o Unconstrained Subtypes: Base type ı ile aynı yapıya sahip farklı isimle tanımlanmış subtypelardır. Bir biri yerine kullanılabilir ve bunun için bir convertion işlemine gerek bulunmamaktadır.
Örnek tanım şekli; SUBTYPE subtype_name IS base_type;

DECLARE
SUBTYPE Balance IS NUMBER;

checking_account Balance(6,2);
savings_account Balance(8,2);
certificate_of_deposit Balance(8,2);
max_insured CONSTANT Balance(8,2) := 250000.00;

SUBTYPE Counter IS NATURAL;
accounts Counter := 1;
deposits Counter := 0;
withdrawals Counter := 0;
overdrafts Counter := 0;

o Constrained Subtypes: Constrained subtype lar bir subtype’ın base’i olan type’ın alt kümesidir diyebiliriz. Yani base type’a precision, range, NOT NULL constraint gibi kısıtlar uygulayarak oluşturacağınız kümeyi içerebilecek bir subtype oluşturmak diyebiliriz.
Tabii ki bu kısıtları base type’ımızın alabileceği kısıtlara göre verebiliriz. Örneğin base type’ımız PLS_INTEGER ise range ile sınırlandırma yapabiliriz. Precision vs. gibi kısıtlar verilemez bir type ise yalnızca NOT NULL constraint’i verebiliriz vs. vs.

DECLARE
SUBTYPE Balance IS NUMBER(8,2);
checking_account Balance;
SUBTYPE Digit IS PLS_INTEGER RANGE 0..9;
SUBTYPE Double_digit IS PLS_INTEGER RANGE 10..99;
SUBTYPE Under_100 IS PLS_INTEGER RANGE 0..99;
BEGIN

o Subtypes with Base Types in Same Data Type Family: Base typeları aynı olmayan ancak aynı veri türü ailesine üye olan türlerdir. Örneğin iki farklı subtype’ın CHAR ve VARCHAR2 veri tiplerini base type olarak kullanması bu durum için örnektir.
Veri türleri aynı aileye üye oldukları için bir birlerine çevrimleri söz konusu olabilir, burada dikkat etmek gereken konu bir birlerinin kısıtlarını bozup bozmamalarıdır.

DECLARE
SUBTYPE Kelime IS CHAR(6);
SUBTYPE Cumle IS VARCHAR2(15);
BEGIN

Burada kelime subtype’ına sahip bir değişken sorunsuz şekilde cumle subtype’ına sahip bir değişkene atılabilir, ancak tersi söz konusu olduğunda yani Cumle subtypelı bir değişkenin değeri Kelime subtypelı bir değişkene atanmak istediğinde değerin uzunluğunun 6 karakteri geçmesi halinde hata alınacaktır(ORA-06502: PL/SQL: numeric or value error: character string buffer too small).

SQL Veri Türleri
Bu veri türlerinden CHAR ve VARCHAR2 arasında bir örnek ile farkındalık yaratmak istiyorum. Aynı uzunluğa sahip iki değişkenimiz olsun ve aynı değerleri atayalım değişkenlere bakalım sonuç nasıl olacak;

Bu veri türlerinden CHAR ve VARCHAR2 arasında bir örnek ile farkındalık yaratmak istiyorum. Aynı uzunluğa sahip iki değişkenimiz olsun ve aynı değerleri atayalım değişkenlere bakalım sonuç nasıl olacak;

Görüldüğü üzere aynı uzunlukta tanımladığım değişkenlere yine aynı uzunlukta veriler atadım ve kelimelerin başına ve sonuna yıldız ekleyerek yazdırmak istediğimde CHAR değişkene atadığım şampiyon ifadesinden sonra yıldıza kadar boşluk kaldığını gördük. Varchar2 de ise bu alanın kullanılmadığını yalnızca atama yapılan kelime kadar yer kaplandığını sonuna boşluk eklenmediğini görüyoruz. Buradan varchar2 tipi kelime sonlarındaki boşlukları siliyor sonucu çıkmamalı, yalnızca kelime kadar alan ayırıyor gereksiz boşluklarla değişkenin uzunluğu kadar yer kaplamıyor. Yani biz “Beşiktaş “ şeklinde sona iki boşluk ekleseydik çıktımız “*Beşiktaş * şeklinde olacaktı.
Cursor Types
Henüz cursor nedir incelemediğimiz için bu türü detaylı anlatmayacağım, ileride ki yazılarda bu konuyu detaylı işleyeceğiz.

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page
1 – Adım Adım PL/SQL
3 – PL/SQL Control Statements

Your comments

Loading Facebook Comments ...

Leave a Reply