VYS11
BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
SQL Programlama: Fonksiyon/Saklı Yordam, Koşul İfadeleri, Döngü İfadeleri, İmleç (Cursor), Tetikleyici (Trigger), Hazır Fonksiyonlar
Konular
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.
Veritabanı tasarımının anlaşılabilirliğini düşürü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.
Fonksiyon Örneği 1
Fonksiyon çağrısı
Koşul İfadeleri
Fonksiyon Örneği 2
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.
Fonksiyon çağrısı
Dil Desteği Ekleme
Linux
plperl diliyle program yazabilmek için plperl dil desteğini ekleme.
BilgisayarAdi@KullaniciAdi:~$ sudo apt-get install postgresql-plperl-9.6
Application Stack Builder uygulaması mevcutsa bu uygulama aracılığı ile de EDB Language Pack yüklenerek ek dil paketleri eklenebilir.
Dil paketi yüklendikten sonra dilin oluşturulması gerekir.
Ekli dilleri göster.
Fonksiyon Örneği 3
plperl dili ile örnek bir fonksiyon örneği aşağıda görülmektedir.
Fonksiyon çağrısı
Fonksiyon Örneği 4
Bir SELECT sorgusunun sonuç kümesi içerisinde dolanımın nasıl yapılacağını gösteren fonksiyon örneği aşağıda gösterilmektedir.
Fonksiyon çağrısı
Fonksiyon Örneği 5
Tablo döndüren fonksiyon örneği aşağıdadır.
Fonksiyon çağrısı
Fonksiyon Örneği 6
Fonksiyon içerisinden fonksiyon çağırma örneği aşağıdadır.
Fonksiyon çağrısı
Fonksiyon Örneği 7
Argüman listesinde çıkış parametresi tanımlanan fonksiyon örneği aşağıdadır.
Fonksiyon çağrısı
İmleç (Cursor)
İmleç (cursor), sorgu sonucunun toplu olarak oluşturulması yerine parça parça (satır satır) oluşturulmasını sağlar.
LIMIT ve OFFSET yapılarının da benzer bir işi yaptığını hatırlayınız.
Yük dengeleme, uygulama sunucusunun, veritabanı sunucusunun ve istemci belleğinin verimli kullanımı vb. amaçlar için kullanılabilir.
İmleç Örneği
Fonksiyon çağrısı
Tetikleyici (Trigger)
INSERT, UPDATE ve DELETE (PostgreSQL'de TRUNCATE için de tanımlanabilir) işlemleri ile birlikte otomatik olarak çalıştırılabilen fonksiyonlardır.
Avantajları
Veri bütünlüğünün sağlanması için alternatif bir yoldur. (Örneğin; ürün satıldığında stok miktarının da azaltılması)
Zamanlanmış görevler için alternatif bir yoldur.
Görevler beklenmeden INSERT, UPDATE ve DELETE işlemlerinden önce ya da sonra otomatik olarak yerine getirilebilir.
Örneğin; kaydı silinen müşteriyi, "EskiMusteriler" tablosuna gönderme.
Tablolardaki değişikliklerin günlüğünün tutulması (logging) işlemlerinde oldukça faydalıdır.
Örneğin; kişinin şifre değişikliğini log tablosuna gönder.
Dezavantajları
Veritabanı tasarımının anlaşılabilirliğini düşürür.
Fonksiyonlarla / saklı yordamlarla birlikte görünür veritabanı yapısının arkasında başka bir yapı oluştururlar.
Ek iş yükü oluştururlar ve dolayısıyla işlem gecikmeleri artabilir.
Tablolarla ilgili her değişiklikte çalıştıkları için ek iş yükü oluştururlar ve bunun sonucu olarak işlem gecikmeleri artabilir.
Tetikleyici Örneği
NorthWind veritabanı kullanmaktadır.
Ürünlerin birim fiyat değişimlerini izlemek için kullanılan bir tetikleyici örneği aşağıdadır.
Before İfadesi
Ekleme ve güncelleme işleminde yeni verinin değiştirilebilmesini/denetimini sağlar
PostgreSQL Hazır Fonksiyonları
Tarih ve Zaman Fonksiyonları
https://www.postgresql.org/docs/11/functions-datetime.html
CURRENT_DATE
O anki tarihi seç.
CURRENT_TIME
O anki zamanı seç.
Zaman bölgesiyle birlikte.
SELECT CURRENT_TIME; -- 10:36:58.477505+03
CURRENT_TIMESTAMP
O anki tarih ve zamanı birlikte seç.
TIMESTAMP: Tarih + Zaman
Zaman bölgesi ile birlikte.
NOW()
O anki zamanı seç.
CURRENT_TIMESTAMP ile aynı.
LOCALTIMESTAMP
O anki tarih ve zamanı birlikte seç.
TIMESTAMP: Tarih + Zaman
Zaman bölgesi olmadan.
AGE
Aralıktaki zamanı döndür.
Verilen zamandan günümüze kadar olan zamanı döndür.
Verilen tarihten günümüze kadar olan zamanı döndür.
Yaş hesapla.
DATE_PART() / EXTRACT()
DATE_PART() ve EXTRACT() fonksiyonları, tarih/zaman'dan ya da zaman diliminden(interval) istenen bölümü almak için kullanılır.
DATE_TRUNC
Tarih-zaman bilgisini istenilen hassasiyette göstermek için kullanılır.
JUSTIFY_DAYS
Zaman aralığını 30 günlük periyotlara bölerek ifade et.
JUSTIFY_HOURS
Zaman aralığını 24 saatlik periyotlara bölerek ifade et.
JUSTIFY_INTERVAL
Zaman aralığını hem JUSTIFY_DAYS hem de JUSTIFY_HOURS kullanarak işaretleri de dikkate alarak ifade et.
EXTRACT EPOCH
UNIX zaman damgasının başından (1.1.1970'den) belli bri ana kadar geçen süre (sn. cinsinden).
Şu ana kadar geçen süre.
Verilen zamana kadar geçen süre.
TO_TIMESTAMP
Zaman damgasına dönüştürme.
UNIX zamanının başlangıç değerini (epoch = 0) UNIX zaman damgasına dönüştür.
Belli bir epoch değerini UNIX zaman damgasına dönüştür.
TO_CHAR
Tarih zaman biçimlendirme.
Tarih zaman fonksiyonu kullanımı örneği
Pagila veritabanından film kiralama sürelerinin bulunması
Matematiksel Fonksiyonlar
Karakter Katarı (String) Fonksiyonları
Veri Tipi Biçimlendirme Fonksiyonları
Last updated