PL/pgSQL: PostgreSQL İçin Güçlü Bir Prosedürel Dil

PostgreSQL logo

PL/pgSQL, PostgreSQL veritabanı sisteminde kullanılan ve veri manipülasyonu işlemlerini daha esnek ve güçlü hale getiren bir prosedürel programlama dilidir. PL/pgSQL ile SQL sorguları ve prosedürel dillerin kontrol yapıları bir arada kullanılabilir, bu da daha karmaşık işlemlerin yapılmasına olanak sağlar.

Bu makalede, PL/pgSQL’in temel özelliklerine giriş mahiyetinde, kullanım alanlarını ve bazı örnek kodlarla nasıl kullanılacağını basit örneklerle inceleyeceğiz. Sonraki makalelerimizde farklı örnekler ile detaylı bir gezinti yapacağız.

PL/pgSQL’in Avantajları

PL/pgSQL kullanımı, birçok avantaj sağlar:

  1. SQL İle Kolay Entegrasyon: PL/pgSQL, PostgreSQL ‘de bulunan SQL sorguları ile sıkı bir entegrasyon içinde çalışır. Bu, hem veri tabanında işlemlerin hızlı yapılmasını hem de SQL sorgularını prosedürel yapılar içinde kullanmayı kolaylaştırır.
  2. Gelişmiş Veri İşleme: Kontrol yapıları (IF, LOOP, CASE vb.) sayesinde veri işleme işlemleri üzerinde daha fazla kontrol sağlar.
  3. Performans İyileştirmesi: Karmaşık SQL sorgularını ve işlemlerini prosedürel yapılar kullanarak daha verimli hale getirebilir.
  4. Hata Yakalama ve Yönetimi: EXCEPTION yapısıyla hatalar yakalanabilir ve bu hatalar için özel işlemler yapılabilir.

PL/pgSQL, PostgreSQL de Procedure ve Fonksiyon olmak üzere iki yapı içinde kullanılır. Bu iki yapıyı sonraki makalelerimizde işleyeceğiz. Bu makalede temel olarak fonksiyon yapılarını baz alacağız.

PL/pgSQL ile Fonksiyonlar

PL/pgSQL’in en yaygın kullanıldığı yerlerden biri fonksiyonlardır. Bir fonksiyon, belirli bir görevi yerine getiren bir kod bloğudur. Fonksiyonlar, veri manipülasyonu ve işleme işlemlerinde büyük kolaylık sağlar.

PL/pgSQL dilinde bir fonksiyon ya da prosedür yazarken aşağıdaki yapısal öğeler kullanılır:

  • DECLARE: Değişkenler ve sabitler burada tanımlanır.
  • BEGIN…END: prosedürel kod bloğu bu iki ifade arasında yazılır.
  • EXCEPTION: Hata yakalama ve yönetimi bu blokta gerçekleştirilir.
  • RETURN: Fonksiyon sonucunu döndüren komuttur. Fonksiyon bir veri döndüreceği gibi, herhangi bir değer de döndürmeyebilir. (void)

Örnek bir PL/pgSQL fonksiyonunun temel yapısı şu şekildedir:

PLSQL
CREATE OR REPLACE FUNCTION fonksiyon_adi(parametreler) 
RETURNS dönen_veri_tipi AS $$
DECLARE
    -- Burada değişken tanımlamaları yapılabilir
BEGIN
    -- Ana işlem bloğu burada bulunur
    RETURN bir_deger;
EXCEPTION
    -- Hata yakalama burada yapılır
END;
$$ LANGUAGE plpgsql;

Bu yapı, PL/pgSQL fonksiyonlarının temeli olup, daha karmaşık fonksiyonların yazılması için de esneklik sağlar.

Örnek 1: Basit Bir PL/pgSQL Fonksiyonu

Aşağıda, iki tam sayı alan ve bu iki sayıyı toplayarak sonucu döndüren bir fonksiyonun nasıl tanımlanacağına dair basit bir örnek bulabilirsiniz:

PLSQL
CREATE OR REPLACE FUNCTION topla(a INT, b INT) RETURNS INT AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plpgsql;

Fonksiyonun kullanımı;

PLSQL
SELECT topla(10, 20);  -- Çıktı: 30

PL/pgSQL ile Veri Manipülasyonu

PL/pgSQL, SQL sorgularını prosedürel yapı ile birleştiren bir dildir. Bu, SQL’in sunduğu güçlü veri sorgulama özelliklerini, programlama mantığı ile bir arada kullanmayı sağlar.

Örnek 1: Basit Bir Veri Ekleme Fonksiyonu

Bir çalışanın bilgilerini bir tabloya bir fonksiyonu en sade şekilde tanımlayalım.

PLSQL
CREATE TABLE calisanlar (
    id SERIAL PRIMARY KEY,
    isim TEXT,
    yas INTEGER,
    pozisyon TEXT
);

CREATE OR REPLACE FUNCTION calisan_ekle(_isim TEXT, _yas INT, _pozisyon TEXT) 
RETURNS VOID AS $$
BEGIN
    INSERT INTO calisanlar (isim, yas, pozisyon) 
    VALUES (_isim, _yas, _pozisyon);
END;
$$ LANGUAGE plpgsql;

Bu fonksiyonu çağırarak yeni bir çalışan kaydedebilirsiniz;

PLSQL
SELECT calisan_ekle('Ali Veli', 30, 'Yazılım Mühendisi');

Veri Manipülasyonu ve Güncelleme

Veri tabanındaki bir kaydı güncellemek de PL/pgSQL ile kolaydır. Aşağıdaki örnek, bir çalışanın yaşını güncelleyen bir fonksiyon içerir:

PLSQL
CREATE OR REPLACE FUNCTION yas_guncelle(_isim TEXT, _yeni_yas INT) 
RETURNS VOID AS $$
BEGIN
    UPDATE calisanlar 
    SET yas = _yeni_yas 
    WHERE isim = _isim;
END;
$$ LANGUAGE plpgsql;

Kontrol Yapıları (IF, CASE) ve Döngüler

IF Koşulu ile Fonksiyonlar

Koşullu ifadeler, PL/pgSQL’in güçlü yönlerinden biridir. Aşağıdaki örnek, bir çalışanın pozisyonuna göre maaşını belirleyen bir fonksiyonu göstermektedir:

PLSQL
CREATE OR REPLACE FUNCTION maas_hesapla(pozisyon TEXT) 
RETURNS NUMERIC AS $$
BEGIN
    IF pozisyon = 'Yazılım Mühendisi' THEN
        RETURN 8000;
    ELSIF pozisyon = 'Proje Yöneticisi' THEN
        RETURN 10000;
    ELSE
        RETURN 6000;
    END IF;
END;
$$ LANGUAGE plpgsql;

Fonksiyonu şu şekilde kullanabiliriz;

PLSQL
SELECT maas_hesapla('Proje Yöneticisi');  -- Çıktı: 10000

-- veya calisanlar tablosunda bir sorguya ekleyebiliriz

SELECT *,maas_hesapla(calisanlar.pozisyon) as "Maaş" FROM calisanlar;

/* Çıktı
  id   isim       yas   pozisyon             Maaş
  1    Ali Veli   30    Yazılım Mühendisi    8000.0
  ..
  ..
*/

CASE İfadesi

CASE, SQL dilinde olduğu gibi PL/pgSQL içinde de kullanılabilir. Aşağıdaki örnek, CASE ifadesini kullanarak daha temiz bir kodlama sağlar:

PLSQL
CREATE OR REPLACE FUNCTION maas_hesapla_case(pozisyon TEXT) 
RETURNS NUMERIC AS $$
BEGIN
    RETURN CASE 
        WHEN pozisyon = 'Yazılım Mühendisi' THEN 8000
        WHEN pozisyon = 'Proje Yöneticisi' THEN 10000
        ELSE 6000
    END;
END;
$$ LANGUAGE plpgsql;

Döngüler ve Tekrarlayan İşlemler

Döngüler, PL/pgSQL’de veri tabanı işlemlerini tekrar tekrar gerçekleştirmek için kullanılır. Örneğin, bir tablodaki tüm satırlar üzerinde işlem yapmanız gerekebilir.

FOR Döngüsü

Aşağıda, bir tablodaki tüm çalışanların isimlerini yazdıran bir FOR döngüsü örneği yer alıyor:

PLSQL
CREATE OR REPLACE FUNCTION tum_calisanlari_yazdir() 
RETURNS VOID AS $$
DECLARE
    calisan REFCURSOR;
    satir RECORD;
BEGIN
    OPEN calisan FOR SELECT isim FROM calisanlar;
    
    LOOP
        FETCH calisan INTO satir;
        EXIT WHEN NOT FOUND;
        RAISE NOTICE 'Çalışan: %', satir.isim;
    END LOOP;

    CLOSE calisan;
END;
$$ LANGUAGE plpgsql;

WHILE Döngüsü

WHILE döngüsü de sıklıkla kullanılır. Örneğin, 1’den 10’a kadar sayıları yazdırmak için şöyle bir fonksiyon yazabilirsiniz:

PLSQL
CREATE OR REPLACE FUNCTION sayi_dongusu() 
RETURNS VOID AS $$
DECLARE
    i INT = 1;
BEGIN
    WHILE i <= 10 LOOP
        RAISE NOTICE 'Sayi: %', i;
        i = i + 1;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

PL/pgSQL ile Tetikleyiciler (Triggers)

Tetikleyiciler, veritabanında belirli bir olay meydana geldiğinde (örneğin, bir tabloya veri eklendiğinde) otomatik olarak çalışan özel prosedürlerdir. Tetikleyiciler, veri bütünlüğünü sağlamak ve belirli işlemleri otomatik hale getirmek için kullanılır.

Örnek 3: Veri Eklenirken Tetikleyici

Aşağıdaki örnek, bir calisan_log tablosuna çalışan eklenirken log kaydı tutan bir tetikleyici fonksiyondur:

PLSQL
--calisanlar için bir log tablosu oluşturalım
CREATE TABLE calisan_log (
    id SERIAL PRIMARY KEY,
    calisan_adi TEXT,
    islem_tarihi TIMESTAMP
);

--calışanlar tablosuna ekleme yapıldıüında loglama yapacak fonksiyon, dönül değeri TRIGGER tipinde olmalı
CREATE OR REPLACE FUNCTION log_calisan_ekleme() 
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO calisan_log (calisan_adi, islem_tarihi)
    VALUES (NEW.isim, NOW());
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

--calisanlar tablomuza kayıt girildikten sonra (after insert) her bir satır için çalışacak (EACH ROW) şekilde fonksiyonumuzu trigger ile bağlıyoruz
CREATE TRIGGER calisan_ekleme_trigger
AFTER INSERT ON calisanlar
FOR EACH ROW EXECUTE FUNCTION log_calisan_ekleme();

PL/pgSQL ile Hata Yakalama (EXCEPTION)

PL/pgSQL, veri manipülasyonu sırasında ortaya çıkan hataları yakalamak ve yönetmek için EXCEPTION bloklarını kullanır. Bu, hatalı işlemler durumunda bile programın çalışmaya devam etmesini sağlar.

Aşağıdaki örnekte, sıfıra bölme hatası meydana geldiğinde yakalanan bir fonksiyon yazılmıştır:

PLSQL
CREATE OR REPLACE FUNCTION bolme_islemi(a INT, b INT) RETURNS TEXT AS $$
BEGIN
    RETURN 'Sonuc: ' || (a / b);
EXCEPTION
    WHEN division_by_zero THEN
        RETURN 'Hata: Sıfıra bölme hatası!';
END;
$$ LANGUAGE plpgsql;

Bu fonksiyonu çağırarak sonuçlarını şu şekilde görebilirsiniz:

PLSQL
SELECT bolme_islemi(10, 2);  -- Çıktı: Sonuc: 5
SELECT bolme_islemi(10, 0);  -- Çıktı: Hata: Sıfıra bölme hatası!

Sonuç

PL/pgSQL, PostgreSQL veritabanı yönetim sistemini çok daha esnek ve güçlü hale getiren bir prosedürel programlama dilidir. SQL sorguları ile prosedürel dilleri birleştirme yeteneği sayesinde, karmaşık işlemler, hata yönetimi, döngüler ve tetikleyiciler gibi özellikler veritabanı yönetimini optimize eder. PL/pgSQL ile veritabanı işlemleri hem daha verimli hale getirilebilir hem de daha esnek bir yapı sunar.

Geliştiriciler, PL/pgSQL kullanarak veritabanı işlemlerini daha güvenilir ve optimize hale getirerek işletimsel verimliliği artırabilirler. Fonksiyonlar, döngüler, tetikleyiciler ve hata yönetimi ile PL/pgSQL, veritabanı yönetiminde çok yönlü ve güçlü bir araçtır.

İlk yorum yapan olun

Bir yanıt bırakın

E-posta hesabınız yayımlanmayacak.


*