SQL Academy · leksjon

Grunnleggende om PL/pgSQL-funksjoner

Skriv PL/pgSQL-funksjoner med parametere, RETURNS TABLE, kontrollflyt (IF, LOOP, FOREACH) og unntaksbehandling.

Leksjon 2 av 413 trinn

Grunnleggende om PL/pgSQL-funksjoner er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva er PL/pgSQL?

PostgreSQLs innebygde prosedyrespråk. SQL utvidet med variabler, kontrollflyt, unntak og muligheten til å kalle spørringer dynamisk. Brukes til lagrede prosedyrer og triggerfunksjoner.

Funksjonsskjelett

En enkel funksjon:

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

Variabler

Deklarer med DECLARE; tilordne med := eller 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;

Kontrollflyt

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;

Løkke over spørringsresultater

Iterasjon i cursor-stil:

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

Returner et resultatsett:

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

Flere returverdier:

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

Håndtering av unntak

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 for logging

Nivåer: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:

RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';

Volatilitetsmarkører

Merk funksjoner riktig for spørringsplanleggeren:

  • IMMUTABLE — samme argumenter gir alltid samme resultat (ingen I/O); tillater inlining og bruk i indekser
  • STABLE — samme argumenter gir samme resultat innenfor én spørring
  • VOLATILE — kan gi ulike resultater for hvert kall (standard; riktig for NOW() og RANDOM())

SECURITY DEFINER

Kjører med funksjonseierens privilegier – bruk med forsiktighet:

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;

Oppsummering

PL/pgSQL utvider SQL med løkker, IF, unntak og strukturerte returverdier. Bruk det til sammenhengende logikk i flere trinn som drar nytte av å kjøre nær dataene.

Kort kontroll

Hvilken volatilitetsmarkør bør du bruke for en funksjon som returnerer samme resultat for de samme argumentene, uten bivirkninger eller I/O?

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
46
Leksjoner
183

Ofte stilte spørsmål

Er leksjonen «Grunnleggende om PL/pgSQL-funksjoner» gratis?

Ja – hele teksten i «Grunnleggende om PL/pgSQL-funksjoner» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Grunnleggende om PL/pgSQL-funksjoner»?

Skriv PL/pgSQL-funksjoner med parametere, RETURNS TABLE, kontrollflyt (IF, LOOP, FOREACH) og unntaksbehandling. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med SQL Academy?

Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Grunnleggende om PL/pgSQL-funksjoner»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?

Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Triggerens anatomi: BEFORE/AFTER, FOR EACH ROW
  2. Grunnleggende om PL/pgSQL-funksjoner
  3. DO-blokker og anonym kode
  4. Revisjon av tabeller med triggere
← Tilbake til SQL Academy