Pl/Sql’de varsayılan olarak gelen bir çok veri tipi vardır. Bunların dışında bizlerde veri tipi oluşturuz genel olarak 3 çeşit veri tipi vardır.

  • Önceden Tanımlı veri türleri(Predefined Datatypes)
  • Kullanıcı tanımlı alt veri tipleri(User-Defined Sub types)
  • Veri tipi çevirici(Datatype Conversion)

Önceden Tanımlı veri türleri(Predefined Datatypes)

PL/SQL de değişkenler,sabitler ve parametereler için scalar,LOB(Large Object),Composite ve Reference olmak üzere 4 çeşit very tipi mevcuttur.

Kategori Açıklama
Scalar Number,date,character veya Boolean tipini kapsar.
LOB Resim,video,ses gibi gibi büyük objeler için.
Composite Recor,table,varray gibi tipler
Reference Diger very tipleri için.

Tam liste aşagıda ki gibidir.

PL-SQL Data Type - PL SQL veri tipi

Kullanıcı tanımlı alt veri tipleri(User-Defined Sub types)

Her bir PL/SQL temel tipi (base type), ona uygulanabilecek bir takım değerler (values) ve işlemler (operations) belirtir. Alttipler de kendi temel tipleri ile aynı işlemleri belirtirler ancak değerlerin sadece bir kısmını belirtirler.

Böylece bir alttip, yeni bir tip değildir ancak temel tipinin sınırlandırılmış bir halidir. Alttipler güvenilirliği artırır, ANSI/ISO tipleri ile uyumluluk sağlar, sabitlerin ve değişkenlerin kullanım amacını göstererek okunurluğu artırır.

PL/SQL ‘de CHARACTER ve INTEGER alttipleri şöyle tanımlıdır:

SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0); -- sadece tamsayılara izin verir

CHARACTER alttipi sınırlandırılmamış (unconstrained) bir alttiptir çünkü temel tipi olan CHAR ile aynı değerleri belirtir, INTEGER alttipi ise sınırlandırılmış (constrained) bir alttiptir çünkü temel tipi olan NUMBER’ın değerlerinin (values) sadece bir kısmını belirtir.

Örnekler ;

SUBTYPE BirthDate IS DATE NOT NULL;  -- based on DATE type
SUBTYPE Counter IS NATURAL;          -- based on NATURAL subtype
TYPE NameList IS TABLE OF VARCHAR2(10);
SUBTYPE DutyRoster IS NameList;      -- based on TABLE type
TYPE TimeRec IS RECORD (minutes INTEGER, hours INTEGER);
SUBTYPE FinishTime IS TimeRec;       -- based on RECORD type
SUBTYPE ID_Num IS emp.empno%TYPE;    -- based on column type

Kullanıcı tanımlı bir alttip (user-defined subtype) türündeki bir değişkenin bildirimi yapılırken aynı zamanda sınırlandırılabilir de.

Alttiplerin (subtypes) kullanımı, sınır dışına taşan (out-of-range) değerlerin belirlenmesini sağlayarak güvenilirliği artırabilir. Aşağıda Numeral alttipi -9….9 aralığındaki tamsayıları tutacak şekilde sınırlandırılmaktadır, eğer program bu sınırların dışında bir değeri bu değişkende tutmak isterse PL/SQL, istisna (exception) verir:

Örnek bir kullanım ;

DECLARE
   SUBTYPE Numeral IS NUMBER(1,0);
   x_axis Numeral;  -- magnitude range is -9 .. 9
   y_axis Numeral;
BEGIN
   x_axis := 10;  -- raises VALUE_ERROR
   ...
END;

Veri tipi çevirici(Datatype Conversion)

Benzer olmayan veri tipine sahip verileri karşılaştırmak için öncelikle verileri ortak bir türe dönüştürmesi gerekir. Tip dönüşümü iki şekilde yapılabilir. İlk olarak bilinçli tür dönüşümleri(Explicit Conversion) iken diğer türü ise biz açıkca belirtmememize rağmen Oracle’ın veriler üzerinde yaptığı bilinçsiz tür dönüşümü (Implicit Conversion) (automatic)  işlemidir.

Explicit Conversion : TO_DATE,TO_NUMBER ve TO_CHAR GİBİ fonksiyonları kullanılarak bilinçli yapılan dönüşümlerdir.

İmplicit Conversion : Oracle’ın kendisinin yaptığı dönüşümlere implicit conversion denir.Örnegin aşağıdaki örnekte start_time ve finish_time karakter tipindeyken ikisi arasındaki farkı bulup bunu elapsed_time atadığımız da oracle bizim yerimize implicit conversion yapmıştır.

DECLARE
   start_time   CHAR(5);
   finish_time  CHAR(5);
   elapsed_time NUMBER(5);
BEGIN
   /* Gece yarisindan sonra gecen zamanin saniye cinsinden degeri aliyoruz */
   SELECT TO_CHAR(SYSDATE,'SSSSS') INTO start_time FROM sys.dual;
   -- tekrardan
   /* tekrardan saniye cinsinden degeri aliyoruz */
   SELECT TO_CHAR(SYSDATE,'SSSSS') INTO finish_time FROM sys.dual;
   /* Aradaki sureyi hesapliyoruz */
   elapsed_time := finish_time - start_time;
   dbms_output.put_line(elapsed_time);
END;

Yararlı olması Dilegiyle …
Yazar : Mustafa Bektaş Tepe

Kaynaklar;
http://www.tutorialspoint.com/plsql/plsql_basic_syntax.htm
https://developersdaily.wordpress.com
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/toc.htm
https://oracle-base.com/articles/misc/introduction-to-plsql

3,352 total views, 2 views today