Kullanıcı Tanımlı İşlevler (Fonksiyonlar / User Defined Functions) UDF

Bir veritabanında birden fazla kullanıcı tanımlı nesne oluşturabilirsiniz. Bunlardan biri de kesinlikle kullanıcı tanımlı fonksiyonlardır. Amaçlandığı şekilde kullanıldığında veritabanlarında çok güçlü bir araçtır. Bugünkü yazımızda bunların nasıl oluşturulacağını, değiştirileceğini, veritabanından kaldırılacağını ve ayrıca nasıl kullanılacağını göreceğiz. O halde gelin konunun detayına girelim.

SQL Sunucu Nesneleri

Girişte de belirtildiği gibi, veritabanında oluşturabileceğiniz farklı türde nesneler vardır. Tablolar ve anahtarların yanı sıra diğer iyi bilinen nesneler prosedürler, tetikleyiciler ve görünümlerdir. Ve elbette günümüzün konusu olan kullanıcı tanımlı işlevler. Nesnelerin arkasındaki ana fikir, onları veritabanında saklamak ve aynı kodu tekrar tekrar yazmaktan kaçınmaktır. Ayrıca girdinin ne olduğunu kontrol edebilir ve çıktının yapısını/türünü tanımlayabilirsiniz. Ve son fakat bir o kadar da önemlisi, izinleri kimin kullanabileceğine ve bunu ne şekilde kullanabileceğine karar vermek için izinleri tanımlayabilirsiniz.

Gelecek yazılarımızda hepsini anlatacağız ama bu yazımızda sadece kullanıcı tanımlı fonksiyonlara odaklanacağız.

Model

Bu yazı dizimizde kullandığımız modeli kendimize hatırlatalım.

Kullanıcı Tanımlı İşlevler (Fonksiyonlar / User Defined Functions) UDF

Bu sefer, bildireceğimiz işlevlerin doğası nedeniyle ve aynı zamanda kullanacağımız sorguların karmaşıklığı nedeniyle (çok daha basit olacaklar) bu modeli eskisi kadar kapsamlı kullanmayacağız. Sorgularımız basit olsa da, çok daha karmaşık sorgularda da kullanıcı tanımlı işlevleri kullanmamanız için hiçbir neden yok.

CREATE/ALTER/DROP Kullanıcı Tanımlı İşlev

Veritabanı nesneleriyle çalışırken şu komutları kullanacaksınız: CREATE (yeni), ALTER (mevcut) ve DROP (mevcut). Sözdizimi CREATE/ALTER/DROP AS gibi bir şeye benzer. Bu, nesne türüne ve ayrıca nesneyi oluşturmanıza, değiştirmenize veya silmenize bağlı olarak biraz farklılık gösterir.

Kullanıcı tanımlı işlevler için bu sözdizimleri aşağıdaki gibi görünür:

Burada çoğu şey oldukça açık olmalıdır. İşlev:

  • Parametreleri girdi olarak alır
  • Bu giriş değerleriyle ( SQL ifadeleri) bir şeyler yapar. Teknik olarak parametre olarak sağlanan değerleri kullanacak ve bunları diğer değerlerle (yerel değişkenler) veya veritabanı nesneleriyle birleştirecek ve ardından bu kombinasyonların/hesaplamaların sonucunu döndürecektir.
  • Daha önce tanımlanan türle ( RETURNS data_type) hesaplamanın sonucunu ( RETURN değeri ) döndürür

ALTER, CREATE'e çok benzer ve yalnızca mevcut işlevi değiştirir. Bir işlevi silmek için DROP FUNCTION deyimini ve bu işlevin adını kullanacağız.

  • Not: Prosedürlerle çalışacak olsaydık, CREATE PROCEDURE, ALTER PROCEDURE ve DROP PROCEDURE'ı kullanırdık.

Kullanıcı Tanımlı Basit Bir İşlev

İlk ve oldukça basit kullanıcı tanımlı fonksiyonumuzu yaratmanın zamanı geldi. Tüm şehirleri listeleyip Londra'ya göre doğu mu batı mı (boylam = 0) olduğunu yazmak istiyoruz. Londra'nın doğusundaki şehirler pozitif city.long değerlerine sahip olurken, Londra'nın batısındaki şehirler bu değere negatif sahip olacaktır.

Fonksiyonu oluşturmak için aşağıdaki kodu kullanacağız:

Bu komutu çalıştırdıktan sonra dikkat etmemiz gereken ilk şey, “Object Explorer”da (bu fonksiyonu oluşturduğumuz veritabanı için) “Skaler değerli fonksiyonlar”ı genişlettiğimizde fonksiyonumuzun artık görünür olmasıdır.

Kullanıcı Tanımlı İşlevler (Fonksiyonlar / User Defined Functions) UDF

Fonksiyonumuz parametre olarak bir sayı almaktadır. Dönüş değeri CHAR(4) türünde olmalıdır. Başlangıç değeri (değişken @return_value) başlangıçta 'aynı' olarak ayarlanmıştır . Parametre (değişken @long) 0'dan büyükse, Londra'nın 'doğusundayız' , 0'dan küçükse Londra'nın 'batısındayız' . @long'un 0 olması durumunda, bu iki If'ten hiçbirinin değeri değiştirmeyeceğine, dolayısıyla başlangıç değerini -> 'same' tutacağına dikkat edin .

Bu aslında basit bir fonksiyon, fakat fonksiyonların neler yapabileceğini göstermenin güzel bir yolu.

Şimdi bu fonksiyonu bir sorgu içerisinde nasıl kullanabileceğimizi görelim. Bunu başarmak için aşağıdaki basit select ifadesini kullanacağız:

Sonuç aşağıdaki resimde gösterilmektedir.

Kullanıcı Tanımlı İşlevler (Fonksiyonlar / User Defined Functions) UDF

Aynı seçimde fonksiyonu 3 kez çağırdığımızı ve çıktının beklendiği gibi olduğunu kolaylıkla fark edebilirsiniz. Bu aslında fonksiyonumuzun beklendiği gibi çalışıp çalışmadığını test ediyordu.

  • Not: Bir işlevi yalnızca adını kullanarak ve gerekli parametreleri sağlayarak çağırırsınız. İşlev değer tabanlıysa, bu işlevi sayı, dize vb. kullandığınız herhangi bir yerde kullanabilirsiniz.

Şimdi bu işlevi daha karmaşık sorguda kullanacağız:

 

 

Kullanıcı Tanımlı İşlevler (Fonksiyonlar / User Defined Functions) UDF

Burada dikkat edilmesi gereken önemli nokta, select sorgumuzda fonksiyonu bir “sütun” olarak kullanmış olmamızdır. İlgili satırın city.long parametresini geçtik ve fonksiyon hesaplamanın sonucunu döndürdü. Bu harika çünkü bir seçme sorgusunda karmaşık hesaplamalar yazmaktan kaçındık ve ayrıca bu işlevi daha sonra başka herhangi bir sorguda yeniden kullanabiliriz.

Not: Kullanıcı tanımlı bir işlev oluşturmanın birkaç avantajı vardır:

  • Karmaşık kod tek bir yapıda saklanır. Daha sonra bu yapıya kara kutudaki gibi bakabilirsiniz; burada yalnızca uygun değerleri parametre olarak iletmekle ilgilenirsiniz ve gerisini fonksiyon halleder.
  • IF veya CASE kullanarak giriş parametrelerini çok daha kolay test edebilir ve hatta işlevlerde döngüler kullanabilirsiniz. Bunu doğrudan SELECT ifadelerinde simüle etmek bazen çok zordur (bazen imkansızdır).
  • Bir işlev oluşturduğunuzda ve düzgün bir şekilde test edildikten sonra, daha sonra beklendiği gibi çalışıp çalışmadığı konusunda endişelenmenize gerek kalmaz ve aynı kodu tekrar tekrar yazmadığınız için hata yapma olasılığından kaçınırsınız ( Aynı kodu yeniden yazmadığınızda daha az zaman harcayacağınızdan bahsetmiyorum bile)
  • Kodunuzda değişiklik yapmanız gerekiyorsa bunu tek bir yerde yapacaksınız ve bu, bu işlevin kullanıldığı her yere yansıyacaktır.

Tabloyu Döndüren Kullanıcı Tanımlı Bir Fonksiyon

Şimdi daha karmaşık bir fonksiyonu inceleyelim. Bu sefer uzun bir argüman olarak geçmek istiyoruz ve fonksiyonun verilen parametreden 'doğu'daki tüm şehirlerin bir tablosunu döndürmesini bekleyeceğiz.

Aşağıdaki işlevi oluşturduk:

Bu fonksiyonun “Nesne Gezgini”ndeki “Tablo Değerli Fonksiyonlar” bölümünde de listelendiğini görebilirsiniz.

Kullanıcı Tanımlı İşlevler (Fonksiyonlar / User Defined Functions) UDF

Şimdi fonksiyonu kullanacağız.

 

 

Kullanıcı Tanımlı İşlevler (Fonksiyonlar / User Defined Functions) UDF

Fonksiyonu bir tablo olarak kullandığımızı fark edebilirsiniz (bu, tablo değerli bir fonksiyondur, dolayısıyla bu oldukça mantıklı görünmektedir ).

Uygulanacak bir fikir

Bunu şimdi yapmayacağım, sadece bir fikir ortaya atıyorum. Bu, başka şekillerde de yapılabilecek bir şeydir (GROUP_CONCAT veya simüle edilmesi), ancak işlev ve döngüler burada gerçekten çok yardımcı olacaktır. Yani yapmak istediğimiz şey şu: Belirli bir city.id için o şehrin doğusundaki ve batısındaki tüm şehirleri bulacak bir fonksiyon yazın. İşlev şöyle bir dize döndürecektir: “doğu: ; batı: . Bu fonksiyonda döngü kullanmalısınız. Google'da aratabilir veya SQL Server'daki döngülerle ilgili yazımızı bekleyebilirsiniz.

Sonuç

Kullanıcı tanımlı işlevler çok güçlü bir araçtır. Veritabanınızda tekrarlayacağınız bir hesaplamanız olduğunda bunları kullanmalısınız. Örneğin, farklı ürünlerdeki verginin önceden tanımlanmış kurallara (zaman içinde değişebilen) göre hesaplanması, bu işlev için iyi bir adaydır. Tüm kuralları oraya koyarsınız, fonksiyona parametreleri iletirsiniz ve sonuç olarak istediğiniz sayıyı alırsınız. Ancak her şeyde olduğu gibi bunları da aşırı kullanmayın.

Kaynak

Yorumunuzu Ekleyin


Yükleniyor...
Yükleniyor...