Fonksiyon (Function) / Saklı Yordam (Stored Procedure)
Koşul İfadeleri, Döngü İfadeleri
İmleç (Cursor)
Tetikleyici (Trigger)
Hazır Fonksiyonlar
Pagila örnek veritabanını kullanmaktadır. (VB Diyagramı: https://dataedo.com/samples/html/Pagila/doc/Pagila_10/modules/Paglia_database_diagram_103/module.html)
Fonksiyon (Function) / Saklı Yordam (Stored Procedure)
Fonksiyonlar / saklı yordamlar, sistem kataloğunda saklanan SQL ifadeleridir. Fonksiyonlar / saklı yordamlar; uygulama yazılımları, tetikleyici ya da başka bir fonksiyon / saklı yordam tarafından çağrılabilirler.
Avantajları
Uygulamanın başarımını iyileştirir.
Fonksiyonlar / saklı yordamlar, bir defa oluşturulduktan sonra derlenerek sistem kataloğunda saklanır. Her çağrıldıklarında SQL motoru tarafından derlenmek zorunda olan SQL ifadelerine göre çok daha hızlıdır.
Uygulama ile veritabanı sunucusu arasındaki trafiği azaltır.
Uzun SQL ifadeleri yerine fonksiyonun / saklı yordamın adını ve parametrelerini göndermek yeterlidir. Ara sonuçların istemci ve sunucu arasında gönderilmesi önlenir.
Yeniden kullanılabilir (reusable).
Tasarım ve uygulama geliştirme sürecini hızlandırır.
Güvenliğin sağlanması açısından çok kullanışlıdır.
Veritabanı yöneticisi, fonksiyonlara / saklı yordamlara hangi uygulamalar tarafından erişileceğini, tabloların güvenlik düzeyleriyle uğraşmadan, kolayca belirleyebilir.
Dezavantajları
Uygulamanın iş mantığı veritabanı sunucusuna kaydırıldığı için uygulama ile veritabanı arasındaki bağımlılık artar ve veritabanından bağımsız kodlama yapmak gitgide imkansızlaşır.
Görünür veritabanı yapısının arkasında, ilişkileri kolayca anlaşılayamayan başka bir yapı oluştururlar.
Fonksiyon / saklı yordam ile program yazmak, değiştirmek (sürüm kontrolü) ve hata bulmak zordur.
Veritabanı Yönetim Sistemi, veri depolama ve listeleme işlerine ek olarak farklı işler yapmak zorunda da kalacağı için bellek kullanımı ve işlem zamanı açısından olumsuz sonuçlara neden olabilir.
Fonksiyonların / saklı yordamların yapacağı işler uygulama yazılımlarına da yaptırılabilir.
CREATE OR REPLACEFUNCTION "fonksiyonTanimlama"(mesaj text, altKarakterSayisi SMALLINT, tekrarSayisi integer)RETURNSTEXT-- SETOF TEXT, SETOF RECORD diyerek çok sayıda değerin döndürülmesi de mümkündürAS$$DECLARE sonuc TEXT; -- Değişken tanımlama bloğuBEGIN sonuc :='';IF tekrarSayisi >0THENFOR i IN1 .. tekrarSayisi LOOP sonuc := sonuc || i ||'.'||SUBSTRING(mesaj FROM1FOR altKarakterSayisi) || E'\r\n';-- E: string içerisindeki (E)scape karakterleri için...ENDLOOP;ENDIF;RETURN sonuc;END;$$LANGUAGE'plpgsql' IMMUTABLE SECURITY DEFINER;
IMMUTABLE: Aynı girişler için aynı çıkışları üretir. Böylece, fonksiyonun gövde kısmı bir kez çalıştırıldıktan sonra diğer çağrılarda çalıştırılmaz. Optimizasyon mümkün olabilir.
Varsayılan VOLATILE: Fonksiyon değeri değişebilir dolayısıyla optimizasyon yapılamaz.
SECURITY DEFINER: Fonksiyon, oluşturan kullanıcının yetkileriyle çalıştırılır.
Varsayılan SECURITY INVOKER: Fonksiyon, çağıran kullanıcının yetkileri ile çalıştırılır.
Ekleme ve güncelleme işleminde yeni verinin değiştirilebilmesini/denetimini sağlar
CREATE OR REPLACEFUNCTION "kayitEkleTR1"()RETURNS TRIGGER AS$$BEGIN NEW."CompanyName"=UPPER(NEW."CompanyName"); -- büyük harfe dönüştürdükten sonra ekle NEW."ContactName"=LTRIM(NEW."ContactName"); -- Önceki ve sonraki boşlukları temizleIF NEW."City"ISNULLTHEN RAISE EXCEPTION 'Sehir alanı boş olamaz'; ENDIF;RETURN NEW;END;$$LANGUAGE"plpgsql";
CREATETRIGGER "kayitKontrol"BEFOREINSERTORUPDATEON"customers"-- veriyi eklemeden/değiştirmeden önce üzerinde işlem yapFOR EACH ROWEXECUTEPROCEDURE"kayitEkleTR1"();