0Pricing
SQL Academy · Lekcja

Podstawy funkcji PL/pgSQL

Pisać funkcje PL/pgSQL z parametrami, RETURNS TABLE, sterowaniem przebiegiem (IF, LOOP, FOREACH) i obsługą wyjątków

Podstawy funkcji PL/pgSQL to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Czym jest PL/pgSQL?

Wbudowany proceduralny język PostgreSQL. Rozszerza SQL o zmienne, sterowanie przepływem, wyjątki i możliwość dynamicznego wywoływania zapytań. Jest używany do tworzenia procedur składowanych i funkcji wyzwalaczy.

Szkielet funkcji

Prosta funkcja:

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

Zmienne

Deklaruj za pomocą DECLARE, a przypisuj wartość za pomocą := lub 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;

Sterowanie przepływem

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;

Iterowanie po wynikach zapytania

Iteracja w stylu kursora:

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

Zwracanie zestawu wyników:

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

Parametry IN / OUT / INOUT

Wiele wartości zwracanych:

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

Obsługa wyjątków

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 do rejestrowania

Poziomy: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:

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

Znaczniki zmienności

Oznaczaj funkcje poprawnie na potrzeby planera:

  • IMMUTABLE — te same argumenty zawsze dają ten sam wynik (bez operacji wejścia/wyjścia); umożliwia inlining i użycie z indeksami
  • STABLE — te same argumenty dają ten sam wynik w ramach zapytania
  • VOLATILE — wynik może różnić się przy każdym wywołaniu (domyślnie; właściwe dla NOW() i RANDOM())

SECURITY DEFINER

Działa z uprawnieniami właściciela funkcji — należy używać ostrożnie:

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;

Podsumowanie

PL/pgSQL rozszerza SQL o pętle, instrukcje IF, obsługę wyjątków i ustrukturyzowane wartości zwracane. Należy go używać do spójnej, wieloetapowej logiki, której korzystnie jest wykonywać się blisko danych.

Szybki sprawdzian

Jakiego oznaczenia zmienności należy użyć dla funkcji, która zwraca ten sam wynik dla tych samych argumentów i nie powoduje efektów ubocznych ani operacji wejścia/wyjścia?

Często zadawane pytania

Czy lekcja „Podstawy funkcji PL/pgSQL” jest bezpłatna?

Tak — pełny tekst „Podstawy funkcji PL/pgSQL” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Podstawy funkcji PL/pgSQL”?

Pisać funkcje PL/pgSQL z parametrami, RETURNS TABLE, sterowaniem przebiegiem (IF, LOOP, FOREACH) i obsługą wyjątków Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Podstawy funkcji PL/pgSQL”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Budowa triggerów: BEFORE/AFTER, FOR EACH ROW
  2. Podstawy funkcji PL/pgSQL
  3. Bloki DO i kod anonimowy
  4. Audytowanie tabel za pomocą triggerów
← Powrót do SQL Academy