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); -- 5Zmienne
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 | cntObsł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
- Budowa triggerów: BEFORE/AFTER, FOR EACH ROW
- Podstawy funkcji PL/pgSQL
- Bloki DO i kod anonimowy
- Audytowanie tabel za pomocą triggerów