Adem KALIN – Yazılım Mühendisi

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

wpid-oracle-y-lupa.jpgMerhaba,

Konuya bir önceki yazımda giriş yapmıştım. Buradan devam etmeden önce şiddetle önceki iki yazımı okumanızı tavsiye ediyorum :

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

MS SQL Server Gözüyle Oracle

Kaldığımız yerden devam edebiliriz 🙂SQL Server’da tablolarda tanımladığımız IDENTITY özelliği burada yok diyebiliriz. SQL Server’da bir tablo create ederken, gerekli bir kolonun IDENTITY property sini set ettiğimizde kolon için başka herhangi bir geliştirmeye gerek kalmadan sequential olarak artmasını sağlayabiliyoruz. Ancak Oracle tarafında bunun karşılığı olan kullanım için tablodan tamamen bağımsız bir SEQUENCE objesi tanımlamamız ve tablonun ilgili kolonu ile ilişkilendirmemiz gerekiyor. Özetle, bir tablo özelliği olarak kullanamıyoruz.

Oracle tarafının en güçlü bulduğum yönlerinden birisi ise Function yada Procedure lere parametre olarak primitive tiplerin yanında UDT ve Table Type ları da kullanabiliyor olmamız.  Table Type ları parametre olarak geçebiliyor olmamız, bir Procedure yada Function’a içeride kullanılmak üzere array gönderip sonuç olarak da bir array alabiliyoruz diyebiliriz. Buna ek olarak şunu söylememiz gerekiyor ki, bir SP içerisinden Select sonucunu SQL Server’daki gibi direkt çıktı olarak alamıyoruz. SQL Server’da bir SP içerisinde yazdığımız SELECT komutlarının hepsinin sonucu her biri ayrı birerer DataTable da olacak şekilde tek bir DataSet olarak döndürülüyor. Ancak Oracle ‘da bir Procedure içerisinden bu şekilde veri dönemiyoruz maalesef. Herhangi bir şekilde komple DataTable dönmek istiyor isek, bunun için DataTable ‘ın karşılığı olacak şekilde bir “SYS_REFCURSOR” tipinde yada ihtiyaca göre ya bir UDT (tek satır bilgi dönülecekse) veya bir Table Type (Array şeklinde bilgi dönülecekse) OUT parametre geçmemiz gerekiyor. BU yöntemlerden herhangi biri ihtiyaca göre kullanılabilir.

Oracle ‘da FROM olmadan bir SELECT cümlesi yazarak basit atamaları yapmamıza izin verilmiyor. Bunun yerine DUAL diye sanal bir tablodan SELECT eder gibi komut yazmamız isteniyor. Aşağıda SQL Server ve Oracle için birer örnek ekliyorum ki daha kolay anlaşılsın.

SQL Server :

SELECT @variable1 = 123456

ORACLE:

SELECT 123456 INTO v_variable FROM DUAL

Böyle bir kısıtlamayla birlikte direkt atamalara izin veriliyor. (Aşağıda bir örneği yazıyorum) Gerekli durumlarda bu şekilde kolay bir kullanım da yapabiliyoruz ORACLE ‘da.

DECLARE
   wages          NUMBER;
   hours_worked   NUMBER := 40;
   hourly_salary  NUMBER := 22.50;
   bonus          NUMBER := 150;
   country        VARCHAR2(128);
BEGIN
   wages := (hours_worked * hourly_salary) + bonus;
   country := 'France';
   country := UPPER('Canada');
END;

SQL Server’da SP yada Funtion gövdelerinde değişken tanımı yaparken isimlendirme için “@” prefix ini kullanmamız gerekiyor. Bu okunabilirlik olarak avantajdı benim için. Ancak Oracle da böyle bir durum söz konusu değil.

Oracle’ın SQL Server’dan ayrılan en büyük özelliklerden biri, tamamen TRANSACTION tabanlı çalışmasıdır. Herşey transaction yapısı içerisinde işletiliyor ve manuel olarak COMMIT edilmediği müddetçe (INSERT/UPDATE/DELETE) geçersiz oluyor diyebiliriz. SQL Server’da ise kendimiz açmadığımız müddetçe bir transaction yönetimi yapılmıyor otomatik olarak.

Güçlü bir Exception Handling altyapısınıa sahip olduğunu söyleyebiliriz. Execution sırasında oluşan exception yani istisnai durumları ayrıntılı şekilde değerlendirebiliyor, yönetebiliyoruz. Hatta Function ve Procedure bloklarının içerisinde mutlaka Exception bloğu eklenmesi tavsiye ediliyor çoğu zaman.

Oracle için IDE’ler üzerinden geliştirme yapacağımız yada uygulamamızdan database bağlantısı kuracağımız zaman, (özetle bir client bağlantı ihtiyacı olduğunda) kullanmamız gereken server tanımlarını mutlaka tnsnames isimli bir dosyaya eklememiz gerekiyor. SQL Server Management Studio uygulamalarında böyle bir tanıma ihtiyacımız bulunmuyor bildiğim kadarıyla.

SQL Server’ın daha özgür olduğu bir nokta : Obje isimleri için karakter sınırlaması… Evet Oracle ‘da tanımlayacağımız herhangi bir obje için (Table, Procedure, Function, Package, Variable…) isimlendirmede kafamıza göre takılamıyoruz maalesef, belli bir karakter sınırlaması var. Sanıyorum bu değer değiştirilebiliyor ancak yine de belirli bir rakam olacağı için kısıtlayıcı bir özellik, dikkatli olmak gerekiyor.

Son olarak Oracle ‘da hoşuma giden bir built-in foksiyondan bahsederek yazıma şimdilik son vermek istiyoru : DECODE… Bu fonksiyon sayesinde bir SELECT ifadesinde gelen değeri belirli şart göre farklı formatta dönemk istediğimizde basitçe kullanabiliyoruz. SWITCH-CASE yapısına kolay bir alternatif olarak düşünebiliriz. Örnek olarak, haftanın günleri için rakamsal 1-7 arası değerlerin tutulduğunu ve bunu geri okuma sırasında gün isimleri olarak dönmek istediğimizi düşünelim. Beklenenin dışında bir değer geldiğinde default bir değer de döndürebiliyoruz. Bu durumları aşağıdaki örnek üzerinden daha iyi anlayabiliriz :

SELECT
   DECODE (DayValue, 
           1, 'Monday', 
           2, 'Tuesday',
           3, 'Wednesday',
           4, 'Thursday',
           5, 'Friday',
           6, 'Saturday',
           7, 'Sunday',
           'Undefined Value : ' || TO_CHAR(DayValue))
FROM Days;

Benden şimdilik bu kadar 🙂 Buraya kadar, basitçe SQL Server’dan Oracle ‘a geçmiş birisi için tespit ettiğim temel farkları yazmaya çalıştım. Bu bilgileri Türkçe yada İngilizce birçok kaynakta fakat dağınık vaziyette elde edebilirsiniz. Ancak benim amacım, farklı farklı kaynaklarda ve dağınık vaziyette olan bilgileri üzerine ufak deneyimlerimi de ekleyerek tek bir yerden ulaşıma sunmak idi. Umarım faydalı olur/olmuştur.

İyi SELECT lemeler 🙂

7 thoughts on “Oracle ‘ın SQL Server ‘dan Farkları – 2

  1. Salih

    Hocam merhaba,
    ben yakın zamanda ms sql üzerinden bir sınava tabi tutulacağım ama uzmanlık alanım pl sql. Pl\sql ile SP ve function yazıyor çok çok fazla select cümlecikleri kullanıyorum günlük işlemlerimde.
    Yazınızdaki decode/switch-case ayırımından tutun da, örneğinizde yer alan aşağıdaki ayırımı kadar her nokta benim için kritik olabilir sınav anında.
    ms sql= SELECT @variable1 = 123456
    Oracle= SELECT 123456 INTO v_variable FROM DUAL

    Algoritma kurma konusunda hiç bir endişe taşımıyorum ama bolca syntax hatasına düşeceğimi öngörüyorum şahsen. Bu gibi olabildiğince çok örneği kısa kısa belirtme şansınız var mı? Ya da bu yapan bir internet sitesi var mı; ben pek bulamadım?

    teşekkürler,

    1. admin Post author

      Merhaba,

      Uzun bir süredir yoğunluk sebebiyle bloğuma bakamamıştım. Bu sebeple yorumunuzu henüz gördüm, vereceğim cevap için geç kalmış olma ihtimalim yüksek, kusura bakmayın.

      Sorunuza gelirsek, bunun için bir liste hazırlamak tahmin edersiniz ki çok zor. Ben sizin tam tersinize SQL Server’dan Oracle tarafına geçenlerdendim. İlk başladığım zamanlarda aralarındaki farkları araştırmak üzere ciddi zaman harcamak durumunda kalmıştım çünkü çok ciddi bir toplu kaynak yoktu, özellikle Türkçe olarak. Bu yüzden farkedebildiklerimi birkaç yazıyla paylaşmaya çalışmıştım.

      Size en belirgin çalışma yolu olarak belirtebileceğim 2 nokta var diyebilirim:

      – SQL Server default olarak Auto Commit çalışır, yani yaptığınız işlem (insert-update-delete) anında kayda etki eder. Fakat belli durumlarda hata alması durumunda geri almak gerekirse, transaction başlatılması gerekir. Oracle ‘da ise default olarak Auto Commit değildir, her işlem bir (insert-update-delete) başlatılmış session içerisinde bir transaction kapsamındadır, Commit ve Rollback yapmak, developera kalmıştır.(Bunu ayrıntılı yazmama gerek yok sanırım, siz konuya hakimsinizdir.)

      – SQL Server’da bir select ten direkt sonuç alabilirsiniz, herhangi bir değişkene atama ihtiyacı yoktur. Hatta bir prosedür içerisinde Select * From Table gibi bir dönüş ile direkt datayı alabilirsiniz. Ancak Oracle’da Begin-End arasındaki herhangi bir kod bloğunda direkt olarak Select * From Table ile sonuç alamazsınız, bir değişkene atamanız gerekir. (Bunu da ayrıntılı yazmama gerek yok sanırım.)

  2. Ramil

    Merhaba.
    Cok guzel bir konuya deyinmişsiniz teşekkür ederim.
    Sorum şu:
    – MSSql-i hangi yazılımlarda kullanmak daha avantajlı? Oracle hangi kapsamlı yazılımlarda kullanmak daha iyi?
    – Büyük bir market için yazılım gelişdiriyorumsa database Oracle ile olsa daha mı süratli olur proqram?
    Yani istediyim o ki, hangi kriterilere göre database seçiliyor. Hem kullanımı, hem problemlerin çözümü kolaylığı ,hem kapsamı hem de geleceye dogru uzunömürlülüyü göz önüne alırsak 🙂
    Cevabınızı sabırsızlıkla bekliyorum. Saygılarımla

    1. ademkalin Post author

      Merhaba, güzel geri dönüşünüz için teşekkür ederim.

      Bir projede SQL Server yada Oracle arasında hangisini kullanacağınız ile ilgili kararda sizi yönlendirebilecek düzeyde bilgiye sahip olduğumu çok çok söyleyemem aslında. Biz işin daha çok development tarafından bakıyoruz nihayetinde. Hangisinde daha rahat development yapıldığını sorarsanız da bu uygulama tarafının hangi teknoloji ile yazılacağına göre değişebilir. Eğer .NET tabanlı bir önyüz uygulaması gelistirecekseniz entegrasyon kısımlarında da geliştirme kısımlarında da SQL Server elbette ki çok daha avantajlı olacaktır. Yine yapılan iş basit şekilde tablodan okuma yazma güncelleme şeklinde olacaksa SQL Server daha kolay olacaktır kullanım açısından. Eğer tam tersine veritabanı yoğunluklu bir business olacaksa yani daha çok data yoğunluklu işlemler söz konusu ise benim tercihim bir developer olarak Oracle olacaktır imkanlar dahilinda.

      Bu işin development tarafından bakılan tarafı. Ancak bu işin bir de asıl kısmı, projelendirme ve maliyet tarafı söz konusu. En nihayetinde sizin projenizin database ayağının çalışması için ona hizmet edecek bir de database server’ı bulunmak durumunda. Mevcutta bir server varsa ve her iki seçenek de mümkünse yukarıdaki yorumuma göre bir tercih yapılabilir elbet. Ancak sıfırdan bir kurulumdan bahsediyorsanız o noktada proje bütçesinde her iki seçenek de ciddi bir kalem teşkil edecektir. Her iki seçenek için ücretsiz sürüm bulunuyor mu açıkçası bilmiyorum. Ancak ücretler açısından Oracle çok daha ciddi seviyelere ulaşabilir. Hatta küçük bir proje olacaksa bu iki seçeneğin bile dışına çıkarak ücretsiz seçenekler değerlendirilmesi gerekebilir. (Mesela MySQL)

      Umarım faydalı bir yorum olmuştur. İkinci kısımdaki maaliyetler konusunda hiç emin olmasam da, zaten mevcutta iki seçenek de (server) mevcut ve kullanımına izin veriliyor ise ilk kısımda yazdıklarımı değerlendirebilirsiniz

      1. ademkalin Post author

        Daha ayrıntılı bir cevap için LinkedIn üzerinde konusabiliriz, ekleyebilirsiniz. İlgili link bloğun üst kısmında mevcuttur, direkt profilime ulaşabilirsiniz

Bir cevap yazın

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