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.