Ana içeriğe geç
Kesit SQL
İleri · SQL Türlerine Özgü

PostgreSQL'de programlama: PL/pgSQL, DO blokları ve eklentiler

Fonksiyon, prosedür, trigger fonksiyonu; RETURNS TABLE; eklenti ekosistemi.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

PL/pgSQL fonksiyonu

CREATE OR REPLACE FUNCTION musteri_ciro(p_musteri INT)
RETURNS NUMERIC
LANGUAGE plpgsql
AS $$
DECLARE
    v_ciro NUMERIC;
BEGIN
    SELECT COALESCE(SUM(oi.quantity * oi.unit_price * (1 - oi.discount)), 0)
      INTO v_ciro
      FROM orders o JOIN order_items oi ON oi.order_id = o.order_id
     WHERE o.customer_id = p_musteri AND o.status = 'delivered';
    RETURN ROUND(v_ciro, 2);
END;
$$;

SELECT customer_id, musteri_ciro(customer_id) FROM customers LIMIT 5;

Gövde $$ ... $$ arasına yazılır (dolar tırnağı); böylece içerideki tek tırnaklar kaçırılmaz.

Tablo döndüren fonksiyon

CREATE OR REPLACE FUNCTION kategori_urunleri(p_kategori TEXT)
RETURNS TABLE (urun TEXT, fiyat NUMERIC)
LANGUAGE sql STABLE
AS $$
    SELECT name, price FROM products WHERE category = p_kategori ORDER BY price DESC;
$$;

SELECT * FROM kategori_urunleri('Kitap');

Anonim blok ve prosedür

DO $$
BEGIN
    RAISE NOTICE 'Toplam sipariş: %', (SELECT COUNT(*) FROM orders);
END;
$$;

-- Prosedürler (PostgreSQL 11+) içinde COMMIT yapılabilir
CREATE PROCEDURE arsivle(p_tarih DATE)
LANGUAGE plpgsql AS $$
BEGIN
    INSERT INTO orders_arsiv SELECT * FROM orders WHERE order_date < p_tarih;
    DELETE FROM orders WHERE order_date < p_tarih;
    COMMIT;
END;
$$;
CALL arsivle('2023-01-01');

Trigger fonksiyonu

CREATE FUNCTION guncelleme_zamani() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
    NEW.updated_at := now();
    RETURN NEW;
END;
$$;

CREATE TRIGGER trg_products_guncelle
BEFORE UPDATE ON products
FOR EACH ROW EXECUTE FUNCTION guncelleme_zamani();

Eklentiler

PostgreSQL'in gücü eklentilerinden gelir: pgvector (vektör arama), PostGIS (coğrafi veri), pg_stat_statements (sorgu istatistikleri), pg_cron (zamanlanmış görev), pg_trgm (benzer metin araması), fuzzystrmatch (soundex, levenshtein), TimescaleDB (zaman serisi). CREATE EXTENSION ad; ile etkinleştirilir.

Alıştırmalara geç (7)