SQL Academy · Les

Basis van PL/pgSQL-functies

Schrijf PL/pgSQL-functies met parameters, RETURNS TABLE, besturingsstroom (IF, LOOP, FOREACH) en foutafhandeling.

Les 2 van 413 stappen

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);   -- 5

Variabelen

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 | cnt

Uitzonderingen 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?

Gratis beginnen

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

  1. Anatomie van triggers: BEFORE/AFTER, FOR EACH ROW
  2. Basis van PL/pgSQL-functies
  3. DO-blokken en anonieme code
  4. Tabellen auditen met triggers
← Terug naar SQL Academy