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

  • https://www.postgresql.org/docs/current/plpgsql-control-structures.html

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.

  • https://www.postgresql.org/docs/current/catalog-pg-language.html

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)

  • https://www.postgresql.org/docs/current/sql-createtrigger.html

  • 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.

LOCALTIME

  • O anki zamanı seç.

  • Zaman bölgesi olmadan.

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

  • https://www.postgresql.org/docs/current/functions-math.html

Karakter Katarı (String) Fonksiyonları

  • https://www.postgresql.org/docs/current/functions-string.html

Veri Tipi Biçimlendirme Fonksiyonları

  • https://www.postgresql.org/docs/current/functions-formatting.html

Last updated