Adem KALIN – Yazılım Mühendisi

Oracle ‘ın SQL Server ‘dan Farkları – 1

wpid-Oracle_Redwood.jpgMerhaba,

Bu yazımda başlıktan da anlaşılacağı üzere Oracle ve SQL Server arasındaki benim çalışırken gördüğüm farklardan bahsedeceğim. Fakat bu farkları, daha öncesi itibariyle hep SQL Server ile çalışıyor olduğum ve Oracle ile nispeten yeni çalışmaya başladığım için Oracle’ın farkları olarak anlatacağım. Benim gibi daha önce SQL Server ile çalışmış fakat Oracle ‘a bir şekilde girmek zorunda kalmış arkadaşlara belki faydası olur. Tabi farklar anlamında bu ilişkinin tam ters yönünde de sonuç çıkarılabilir yazacaklarımdan, SQL Server’ın Oracle’dan farkları da ortaya çıkmış olabilir. Yazıyı okumaya geçmeden önce, intro niteliğinde yazdığım önceki yazımı okumanızda fayda olacağını düşünüyorum : MS SQL Server Gözüyle Oracle

Fazla uzatmadan başlayalım…

Öncelikle, Oracle için genellikle TOAD, PL/SQL Developer gibi third party yazılımlar (IDE’ler) üzerinde geliştirme yapılıyor. Şu an bildiğim kadarıyla Oracle’ın, Microsoft gibi kendi piyasaya sürdüğü gelişmiş bir IDE’si mevcut değil. Bu yüzden bazı kullanılan özellikler ufak farklarla birlikte değişebiliyor IDE’sine göre 🙂 (IDE’lerin ayrıntılarına girmeyeceğim) Ben ofis bilgisayarımda şu an genel itibariyle PL/SQL Developer kullanıyorum.

Farklara girerken öncelikle veri tiplerinden başlamak istiyorum. İki DBMS arasında gördüğüm en temel farklardan biri, SQL Server’ın INT, DECIMAL, MONEY gibi nümerik değerler için ayrı ayrı tipler sunarken, Oracle’ın bunların tamamı için yalnızca NUMERIC tipini sunması oldu. Aralarında ayrım yapmak için tek yapılması gereken, tip tanımı yapılırken NUMERIC(12,2) gibi değerin skalasının da verilmesi. Bu tabi kimi zaman kolaylıklar sunarken, kimi zaman da (.NET kodları içinde kullanılırken olduğu gibi) tip dönüşümleri anlamında sıkıntılara sebep olabiliyor. Oracle’ın desteklemiş olduğu primitive tipler aşağıdaki gibidir, bu bilgileri her yerde bulabilirsiniz zaten, ayrıntılarına girmiyorum :

  • wpid-oracle_database.jpgNumber(n,m)
  • Char (n)
  • Varchar2(n)
  • Date
  • Long
  • Long raw
  • Raw
  • Blob
  • Clob
  • Nclob
  • Bfile

Oracle’ın veri tipleri anlamında güçlü olduğu bir nokta, bu primitive tiplerin yanında User Defined Type ‘ları da destekliyor olması. Böylece, kendi veri tipimizi oluşturarak sorgularımızda gerekli durumlarda kullanabiliyoruz. User Defined Type ‘ları Nesneye Dayalı Programlama (OOP) mimarisindeki struct lara benzetebiliriz. UDT ların en çok kullanıldığı yer ise yine Oracle’ın farklı olarak desteklediği Table Type türlerdir. Bunları her satırı birer UDT olan array ‘ler olarak da düşünebiliriz. Kafanızda daha iyi şekillenmesi açısından daha somut bir örnek vereyim. UDT ları bir database tablosunun kolonları, Table Type ‘ları ise bu tablo olarak düşünebiliriz. (Umarım anlaşılmıştır 🙂 ) Veri tiplerinin üzerinde daha fazla durmak istemiyorum, kullandıkça öğrenilecektir ayrıntıları.

Oracle prosedürel bir DBMSdir diyebiliriz. Bütün SQL komutları bloklardan oluşmaktadır ve işlemler sürekli olarak procedure ler ve function lar çağrılarak tamamlanır. Genel itibari ile tekil SQL komutları çalışıtırılmaz. Bu yapıyı destekleyen bence en büyük yeteneği ise PACKAGE ‘lar tanımlayabiliyor olmamızdır. PACKAGE ‘ları OOP mimarisindeki sınıflara benzetebiliriz kısaca. Kendi içerisinde değişkenlere, fonksiyon ve prosedürlere sahip olabiliyorlar. Bu özelliklerin tamamını veya bir kısmını dışarıdan kullanıma da açabiliyoruz. Kendi içerisinde belli bir mantığa sahip olabiliyor. Kısaca kendi işini kendi yapıyor J

wpid-sqlserver.jpgBir komut parçacığı her zaman BEGIN-END bloğu içerisinde yer almalıdır. Aynı zamanda Oracle bir komutun bittiğini anlamak için, komut sonundaki “;” işaretini kontrol eder. Bunun kullanım şekli ve amacı aynen .NET’te olduğu gibidir. Bir SELECT cümlesi, bir BEGIN-END bloğu yada bir IF-ELSE bloğu vs ne olursa olsun komut “;” ile bitmelidir. Ayrı ayrı SELECT cümlelerini “;” olmadan çalıştırabiliriz basit testlerimiz sırasında ancak eğer birden fazla SELECT cümlesini çalıştırmak istiyorsak her bir komut bloğunu “;” ile sonlandırmalıyız.

Bütün komutların BEGIN-END bloğu içerisinde yazılmasından dolayı bir zorunluluk daha getiriyor Oracle. Blok içerisinde herhangi bir SELECT komutu yazdığımızda bunun sonucunu INTO ile daha önce tanımlamış olduğumuz değişkenlere almak zorundayız. Yani “Eğer ki SELECT etmişsen kullanmak üzere select etmişsindir, o zaman değişkene ata” gibi bir düşünce hakim anlayacağınız. SQL Server’dan kolayca SELECT etmeye alışanlar bu konuda ilk başlarda şaşırabilirler J

Oracle ‘da sevdiğim özelliklerden biri %TYPE ve %ROWTYPE kullanımları.. SELECT sonucunu bir değişkene atamak istediğinizde öncelikle SELECT sonucunda gelecek verinin tipini bilmeniz gerekiyor SQL Server’da. Fakat Oracle’da bunun için bir zorunluluk söz konusu değil J Çünkü tanımlayacağımız değişkenin tipinin SELECT sonucunda gelecek kolon yada satır ile aynı olmasını %TYPE ve %ROWTYPE ile sağlayabiliyoruz. Bu şekilde, aynı zamanda tablo kolonunun tipinde bir değişiklik yapıldığında tanımlanmış olan değişkenin de tipi değişmiş olur. Aşağıdaki örnekten söylemek istediğimi anlayabilirsiniz rahatlıkla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DECLARE
  v_Variable Table1.Column1%TYPE;
  v_Record Table1%ROWTYPE;
 
BEGIN
 
  SELECT Column1
  INTO v_Variable
  FROM Table1;
 
  SELECT *
  INTO v_Record
  FROM Table1;
 
END;

Konuya burada ara veriyorum. Sizi daha fazla sıkmak istemem. Devamına bir sonraki yazımdan ulaşabilirsiniz.

Görüşmek üzere..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir