Grundlagen von PL/pgSQL-Funktionen
Schreiben Sie PL/pgSQL-Funktionen mit Parametern, RETURNS TABLE, Kontrollfluss (IF, LOOP, FOREACH) und Ausnahmebehandlung.
Grundlagen von PL/pgSQL-Funktionen ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist PL/pgSQL?
Die integrierte prozedurale Sprache von PostgreSQL. SQL, erweitert um Variablen, Kontrollfluss, Ausnahmen und die Möglichkeit, Abfragen dynamisch aufzurufen. Wird für gespeicherte Prozeduren und Triggerfunktionen verwendet.
Funktionsgerüst
Eine einfache Funktion:
CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
SELECT add(2, 3); -- 5Variablen
Mit DECLARE deklarieren; mit := oder INTO zuweisen:
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;Kontrollfluss
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;Abfrageergebnisse durchlaufen
Cursor-ähnliche Iteration:
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
Eine Ergebnismenge zurückgeben:
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-Parameter
Mehrere Rückgabewerte:
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 | cntAusnahmebehandlung
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 für die Protokollierung
Ebenen: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:
RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';Volatilitätskennzeichnungen
Kennzeichnen Sie Funktionen korrekt für den Planner:
- IMMUTABLE — dieselben Argumente liefern immer dasselbe Ergebnis (keine I/O); ermöglicht Inlining und die Verwendung in Indizes
- STABLE — dieselben Argumente liefern innerhalb einer Abfrage dasselbe Ergebnis
- VOLATILE — kann sich bei jedem Aufruf unterscheiden (Standard; korrekt für NOW(), RANDOM())
SECURITY DEFINER
Wird mit den Berechtigungen des Funktionsbesitzers ausgeführt – verwenden Sie dies mit Bedacht:
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;Rückblick
PL/pgSQL erweitert SQL um Schleifen, IF, Ausnahmen und strukturierte Rückgabewerte. Verwenden Sie es für zusammenhängende Abläufe aus mehreren Schritten, die von der Ausführung nahe an den Daten profitieren.
Kurzer Test
Welchen Volatilitätsmarker sollten Sie für eine Funktion verwenden, die bei denselben Argumenten immer dasselbe Ergebnis zurückgibt und keine Nebenwirkungen oder Ein-/Ausgabevorgänge hat?
Häufig gestellte Fragen
Ist die Lektion „Grundlagen von PL/pgSQL-Funktionen“ kostenlos?
Ja — der vollständige Text von „Grundlagen von PL/pgSQL-Funktionen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Grundlagen von PL/pgSQL-Funktionen“?
Schreiben Sie PL/pgSQL-Funktionen mit Parametern, RETURNS TABLE, Kontrollfluss (IF, LOOP, FOREACH) und Ausnahmebehandlung. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Grundlagen von PL/pgSQL-Funktionen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Aufbau von Triggern: BEFORE/AFTER, FOR EACH ROW
- Grundlagen von PL/pgSQL-Funktionen
- DO-Blöcke und anonymer Code
- Tabellen mit Triggern auditieren