0Pricing
SQL Academy · Lektion

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

Variablen

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

Ausnahmebehandlung

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

  1. Aufbau von Triggern: BEFORE/AFTER, FOR EACH ROW
  2. Grundlagen von PL/pgSQL-Funktionen
  3. DO-Blöcke und anonymer Code
  4. Tabellen mit Triggern auditieren
← Zurück zu SQL Academy