Wenn du Funktionen in PostgreSQL schreibst, ist eine der ersten Fragen: Wie gebe ich ein Ergebnis zurück? Manchmal willst du einfach nur eine Zahl zurückgeben. Manchmal eine ganze Tabelle. Und manchmal sogar mehrere Datensätze. In diesem Abschnitt schauen wir uns alle wichtigen Varianten an: vom einfachsten RETURN bis zu RETURN QUERY, RETURNS TABLE und SETOF.
Ein Ergebnis: RETURN
Wenn deine Funktion nur einen Wert zurückgeben soll – zum Beispiel eine Summe oder die Anzahl der Zeilen – dann benutze einfach RETURN.
CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
total INT;
BEGIN
SELECT COUNT(*) INTO total FROM students;
RETURN total;
END;
$$ LANGUAGE plpgsql;
Wenn du eine Funktion in PL/pgSQL erstellst, musst du angeben, was sie zurückgibt. Das betrifft das Schlüsselwort RETURNS, das das "Format" des Ergebnisses festlegt, das die Funktion zurückgibt. Also egal, ob du eine Zahl, einen Text oder eine Datentabelle zurückgeben willst – das alles musst du in der Zeile mit RETURNS angeben.
Ein einfaches Beispiel:
CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
Hier gibt das Schlüsselwort RETURNS INT an, dass die Funktion eine Zahl zurückgibt.
Einzelnen Wert zurückgeben
Lass uns mit dem Einfachsten anfangen – einer Funktion, die einen einzelnen Wert zurückgibt. Zum Beispiel eine Funktion, die die Anzahl der Studenten in der Tabelle students zählt:
CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
total INT;
BEGIN
SELECT COUNT(*) INTO total FROM students; -- Wir speichern das Ergebnis der Abfrage in der Variable total
RETURN total; -- Wir geben das Ergebnis zurück
END;
$$ LANGUAGE plpgsql;
Jetzt können wir diese Funktion aufrufen:
SELECT count_students(); -- Gibt die Anzahl der Studenten zurück
Mehrere Werte mit RETURNS TABLE zurückgeben
Manchmal willst du nicht nur einen Wert zurückgeben, sondern eine ganze Liste von Datensätzen. Zum Beispiel eine Liste aller Studenten mit ihren Namen und IDs. Dafür benutzt man RETURNS TABLE.
CREATE FUNCTION get_students() RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
RETURN QUERY SELECT id, name FROM students; -- Gibt das Ergebnis der Abfrage als Tabelle zurück
END;
$$ LANGUAGE plpgsql;
Jetzt können wir diese Funktion aufrufen:
SELECT * FROM get_students(); -- Gibt eine Tabelle mit allen Studenten zurück
Achte auf die Schlüsselwörter RETURNS TABLE. Sie sagen, dass die Funktion eine Tabelle mit den angegebenen Spalten (id und name in diesem Fall) zurückgibt.
RETURN QUERY verwenden
Unser Beispiel oben war schon ziemlich cool. Aber hier noch ein Detail: RETURN QUERY ist der Zauberstab von PL/pgSQL, mit dem du Daten direkt aus einer Abfrage zurückgeben kannst. Damit kannst du das Ergebnis einer ganzen Abfrage oder auch nur einen Teil davon zurückgeben.
Angenommen, wir wollen alle Studenten zurückgeben, die aktiv studieren (ihr Status in der Datenbank ist active = TRUE):
CREATE FUNCTION get_active_students() RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
RETURN QUERY
SELECT id, name
FROM students
WHERE active = TRUE; -- Gibt nur aktive Studenten zurück
END;
$$ LANGUAGE plpgsql;
Jetzt können wir die Funktion aufrufen und die Daten der aktiven Studenten bekommen:
SELECT * FROM get_active_students();
Mehrere Zeilen ohne RETURNS TABLE zurückgeben
In manchen Fällen willst du Zeilen zurückgeben, ohne RETURNS TABLE zu benutzen. Dafür kannst du den Datentyp SETOF verwenden. Damit gibst du Zeilen mit derselben Struktur zurück. Zum Beispiel:
CREATE FUNCTION get_student_names() RETURNS SETOF TEXT AS $$
BEGIN
RETURN QUERY
SELECT name
FROM students;
END;
$$ LANGUAGE plpgsql;
Diese Funktion gibt einfach nur die Liste der Studentennamen zurück:
SELECT * FROM get_student_names();
Werte abhängig von Eingabedaten zurückgeben
Funktionen geben nicht immer nur statische Ergebnisse zurück. Sie können Parameter verwenden, um die Ergebnisse dynamisch zu ändern.
Hier ein Beispiel, wie man Daten nach der ID eines Studenten zurückgibt:
CREATE FUNCTION get_student_by_id(student_id INT) RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
RETURN QUERY
SELECT id, name
FROM students
WHERE id = student_id; -- Wir benutzen den Parameter student_id
END;
$$ LANGUAGE plpgsql;
Jetzt kannst du Infos zu einem bestimmten Studenten abfragen:
SELECT * FROM get_student_by_id(3); -- Gibt die Daten des Studenten mit ID = 3 zurück
Komplexe Daten zurückgeben (mehrere Sets)
Manchmal sind die Daten so komplex, dass du mehrere Sets zurückgeben willst. Dafür kannst du Cursor verwenden. Zum Beispiel, wenn du zwei Datensätze aus einer Funktion liefern willst – eine Liste der aktiven und eine der inaktiven Studenten.
CREATE FUNCTION get_students_status() RETURNS SETOF RECORD AS $$
BEGIN
RETURN QUERY
SELECT id, name, 'aktiv' AS status
FROM students
WHERE active = TRUE;
RETURN QUERY
SELECT id, name, 'inaktiv' AS status
FROM students
WHERE active = FALSE;
END;
$$ LANGUAGE plpgsql;
Jetzt kannst du beide Datensätze bekommen:
SELECT * FROM get_students_status();
Typische Fehler bei RETURNS
Keinen Rückgabetyp angegeben: Wenn du nicht angibst, was die Funktion zurückgibt, gibt PostgreSQL einen Fehler aus. Zum Beispiel:
CREATE FUNCTION no_return_type() AS $$ -- Fehler, RETURNS fehlt
BEGIN
RETURN 1;
END;
$$ LANGUAGE plpgsql;
Datentypen stimmen nicht überein: Achte darauf, dass die zurückgegebenen Werte zu den deklarierten Typen passen. Wenn du zum Beispiel INT angibst, versuch nicht, einen String zurückzugeben.
Vergessen, RETURN QUERY zu benutzen: Wenn du RETURN QUERY bei einer komplexen Abfrage vergisst, gibt die Funktion einfach nichts zurück.
Falsches Zurückgeben mehrerer Werte: Wenn du eine Datenzeile zurückgibst, aber SETOF oder TABLE vergisst, gibt PostgreSQL einen Fehler aus.
GO TO FULL VERSION