Basis van PL/pgSQL-functies
Schrijf PL/pgSQL-functies met parameters, RETURNS TABLE, besturingsstroom (IF, LOOP, FOREACH) en foutafhandeling.
Basis van PL/pgSQL-functies is een gratis SQL Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject SQL Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus SQL Academy bevat in totaal 4 lessen.
Wat is PL/pgSQL?
De ingebouwde procedurele taal van PostgreSQL. SQL uitgebreid met variabelen, besturingslogica, uitzonderingen en de mogelijkheid om query's dynamisch aan te roepen. Wordt gebruikt voor opgeslagen procedures en triggerfuncties.
Basisstructuur van een functie
Een eenvoudige functie:
CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
SELECT add(2, 3); -- 5Variabelen
Declareer met DECLARE; wijs een waarde toe met := of INTO:
CREATE FUNCTION user_orders(uid BIGINT)
RETURNS INT AS $$
DECLARE
cnt INT;
BEGIN
SELECT COUNT(*) INTO cnt FROM orders WHERE user_id = uid;
RETURN cnt;
END;
$$ LANGUAGE plpgsql STABLE;Besturingslogica
IF / ELSE, FOR, WHILE, CASE:
IF cnt = 0 THEN
RAISE NOTICE 'no orders';
ELSIF cnt < 10 THEN
RAISE NOTICE 'few';
ELSE
RAISE NOTICE 'many';
END IF;
FOR i IN 1..10 LOOP
RAISE NOTICE '%', i;
END LOOP;Itereren over queryresultaten
Iteratie in de stijl van een cursor:
CREATE FUNCTION recalc_totals() RETURNS VOID AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT id FROM users LOOP
UPDATE users SET
order_count = (SELECT COUNT(*) FROM orders WHERE user_id = r.id)
WHERE id = r.id;
END LOOP;
END;
$$ LANGUAGE plpgsql;RETURNS TABLE
Een resultatenset retourneren:
CREATE FUNCTION top_buyers(n INT)
RETURNS TABLE (user_id BIGINT, total NUMERIC) AS $$
BEGIN
RETURN QUERY
SELECT o.user_id, SUM(o.total)
FROM orders o
GROUP BY o.user_id
ORDER BY SUM(o.total) DESC
LIMIT n;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM top_buyers(10);IN- / OUT- / INOUT-parameters
Meerdere retourwaarden:
CREATE FUNCTION stats(uid BIGINT,
OUT total NUMERIC,
OUT cnt INT) AS $$
BEGIN
SELECT SUM(total), COUNT(*) INTO total, cnt
FROM orders WHERE user_id = uid;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM stats(42); -- total | cntUitzonderingen afhandelen
BEGIN ... EXCEPTION WHEN ... THEN:
BEGIN
INSERT INTO users (email) VALUES ($1);
EXCEPTION
WHEN unique_violation THEN
RAISE NOTICE 'email already exists';
WHEN OTHERS THEN
RAISE;
END;RAISE voor logboekregistratie
Niveaus: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:
RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';Markeringen voor veranderlijkheid
Markeer functies correct voor de planner:
- IMMUTABLE — dezelfde argumenten leveren altijd hetzelfde resultaat op (geen I/O); maakt inline-uitvoering en gebruik met indexen mogelijk
- STABLE — dezelfde argumenten leveren binnen één query hetzelfde resultaat op
- VOLATILE — kan per aanroep verschillen (standaard; correct voor NOW() en RANDOM())
SECURITY DEFINER
Wordt uitgevoerd met de bevoegdheden van de eigenaar van de functie — gebruik dit zorgvuldig:
CREATE FUNCTION sensitive_op() RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$ ... $$;
-- Always set search_path explicitly to avoid hijacking:
ALTER FUNCTION sensitive_op() SET search_path = public, pg_temp;Samenvatting
PL/pgSQL breidt SQL uit met lussen, IF, uitzonderingen en gestructureerde retourwaarden. Gebruik het voor samenhangende logica uit meerdere stappen die er baat bij heeft dicht bij de gegevens te worden uitgevoerd.
Korte controle
Welke volatiliteitsmarkering gebruik je voor een functie die met dezelfde argumenten steeds hetzelfde resultaat retourneert, zonder neveneffecten of invoer/uitvoer?
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 46
- Lessen
- 183
Veelgestelde vragen
Is de les “Basis van PL/pgSQL-functies” gratis?
Ja — de volledige tekst van “Basis van PL/pgSQL-functies” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus SQL Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus SQL Academy bevat in totaal 4 lessen.
Wat leer ik in “Basis van PL/pgSQL-functies”?
Schrijf PL/pgSQL-functies met parameters, RETURNS TABLE, besturingsstroom (IF, LOOP, FOREACH) en foutafhandeling. Je oefent met SQL Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met SQL Academy te beginnen?
Ervaring vooraf is niet nodig. SQL Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Basis van PL/pgSQL-functies”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over SQL Academy?
Ja. Elke les over SQL Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Anatomie van triggers: BEFORE/AFTER, FOR EACH ROW
- Basis van PL/pgSQL-functies
- DO-blokken en anonieme code
- Tabellen auditen met triggers