26 Nisan 2012 Perşembe

MS SQL 'de User Defined Functions - Giriş

Merhaba arkadaşlar.
Sql server 'da çok sık kullandığımız işlemleri, her defasında farklı değerler için kullanıyorsak, o işlemleri tekrar tekrar yazmaktansa bir kere tanımlayıp, istediğimiz yerde kullanabiliriz. Nasıl c sharp 'ta gereksiz yere kod tekrarı yapmak istemiyorsak, t-Sql dilinde de bu durum aynı arkadaşlar. Yapılacak işlemleri farklı değerlere göre uygulamak ve bu işlemlerden dönen değerlere göre sonuç almak için kullanılan kodların tümüne "function" adı verilir. Nasıl programlamada geriye değer döndüren metotlara function diyorsak bu durum burada da geçerlidir.

Normalde sistemde kayıtlı bir çok function vardır. Bunların tümüne "System Functions" diyoruz. Bunlar sayesinde datalarımızı istediğimiz gibi manipule (yönetme) edebiliyoruz. Ama bazen system functions 'lar da yetersiz kalıyor. İşte bu durumda arkadaşlar kendi fonksiyonlarımızı yazmak mecburiyetindeyiz. İhtiyaçlarımız doğrultusunda bizim tanımladığımız bu fonksiyonlara da "User Defined Functions" (kullanıcı tanımlı fonksiyonlar) diyoruz.

Peki fonksiyonlar neden kullanılır?
  • Pratiklik: Yukarıda da belirttiğim üzere gereksiz yere kod tekrarı yapmaktan kurtarır. Bir işlemi her defasında yazmaktansa bir kere tanımlayıp, her yerden çağırma olanağı sunar.
  • Kod Okunabilirliği: Bir script içerisinde daha az kod kullanılacağından dolayı, bizi kod karmaşasından kurtarır.
  • Performans: Fonksiyonların en önemli özelliğidir. Nasıl bir performanstan bahsediyoruz biraz inceleyelim. Bir sorgu çalışmadan önce 5 aşamadan geçer. Önce kodun yazım hataları, syntax 'ı, semantic 'i kontrol edilir(Parse). Daha sonra sorguda kullanılan tabloların kolonları var mı, ona bakılır(Resolve). Bu ıslemden sonra sorgunun sonucunu nasıl döndüreceğini, indexlemeleri kontrol eder(Optimize). Daha sonra döndüreceği şeklı belirledikten sonra derleme işlemi yapılır(Compile). Son olarak sorgu çalışır ve sonuç döner(Execute). Fonksiyonumuz çalıştığında, "compile" işlemi dahil compile 'dan önceki tüm aşamaları işlemeden geçer. Geriye sadece "execute" işlemi kalır. Bu da önemli bir hız demektir.
NOT: "User Defined Functions" , "Strored Procedures" , "Views" yukarıda anlattığım sebepten dolayı, şablon yapıları itibariyle "Subquery" 'lerden (iç içe sorgulardan) daha performanslı çalışır.

"User Defined" fonksiyonlarını "Strored Procedures" 'lerden ayıran en büyük özellik ise sorgu içerisinde kullanılabilmeleridir. "Strored Procedures" 'ler sorgu içerisinde kullanılmazlar. Çünkü başlı başına bir iş yaparlar. "User Defined" fonksiyonları ise bir işi yapmada yardımcı fonksiyon olarak çalışırlar.

"User Defined Functions", parametre almaları şart değildir. Parametresiz olarak da kullanılabilirler. Fakat geriye mutlaka bir değer döndürdüklerinden dolayı "returns" ve "return" keyword 'lerini kullanmalıdırlar.

Fonksiyonlar database nesneleridir. Bu nedenle DDL (Data Defination Language) dili ile yönetilirler. Yani "create, alter ve drop" keyword 'leriyle kullanılırlar. Database nesneleri oldukları için hangi database 'de oluşturulmuşlarsa, "object explorer" penceresinde o database sekmesi altında "Programmability" sekmesinin de altında "Function" sekmesinde yer alırlar. Aşağıda da görüldüğü gibi "Function" sekmesi altında 4 tane sekme mevcuttur. "Aggregate Functions" ve "System Functions" sistemde tanımlı sistem fonksiyonlarıdır. "Table-valued Functions" ve "Scalar-valued Functions" ise bizim tanımladığımız "user defined functions" fonksiyonlardır.


"User Defined Functions" 'ları 3 ana başlık altında inceleyeceğiz:
  1. Scalar Functions
  2. In-Line Table Valued Functions
  3. Multistatement Table Valued  Functions
"Scalar Functions" geriye sadece tek bir değer dönen durumlarda kullanırlar. Diğer iki "Table Valued Functions" ise geriye bir tablo döndüren durumlarda kullanılırlar. "Scalar" ve "In Line Table Valued" fonksiyonları sadece "select" sorgularını kullanabilirler. (Bu yönde "View" nesneleriyle benzerlik gösterirler. Fakat bildiğiniz üzere "view" nesneleri parametre alamazlar.) "Multistatement Table Valued" fonksiyonları ise gövdesinde "DML (Data Manipulation Language-Veri Yönetim Dili)" dilini kullanabilir. Yani içinde "insert,update ve delete" sorguları çalıştırabilir.

"Scalar" fonksiyonlar tanımlanırken değil ama çağırılırken ikinci kısmıyla birlikte yani başında "dbo." (Database Owner - Veritabanı Sahibi) sözcüğü ile çağırmak zorundadır. "Table Valued" fonksiyonlarında böyle bir zorunluluk yoktur. Ayrıca "Scalar" ve "Multistatement Table Valued" fonksiyonlarda "begin-end" sözcüklerinin kullanılması şarttır. Bizim c-sharp 'ta kullandığımız skopların yaptığı görevi görür. "In Line Table Valued" fonksiyonlarda böyle bir şart yoktur.

"User Defined" fonksiyonları tanımlandıktan sonra "Object explorer" penceresindeki yerleri farklı olabilir. "Scalar" fonksiyonlar "Scalar-valued Functions" sekmesinde, "In-Line Table Valued" ve "Multistatement Table Valued " fonksiyonları ise "Table-valued Functions" sekmesinde yer alırlar.

"User Defined Function" konusuna giriş yaptık. İlerleyen makalelerimde daha ayrıntılı bir şekilde inceleyeceğiz.

Başka bir yazıda görüşmek dileğiyle, hoşçakalın...

Hiç yorum yok:

Yorum Gönder