Rückgabetypen

Der Rückgabetyp war bisher immer eine Form von Skalar, etwa ein VARCHAR oder ein bigint. Aber es gibt weitere Möglichkeiten.

Wenn Sie mehrere Rückgabewerte aus einer Funktion geben wollen, müssen Sie einen OUT-Parameter in der Funktion verwenden. Dazu wird zusätzlich ein OUT vor den entsprechenden Parameter geschrieben:

CREATE OR REPLACE FUNCTION zweizahlen(OUT x INT, OUT y INT) AS $$
  SELECT 5, 77
$$ LANGUAGE SQL;

SELECT * FROM zweizahlen();
--   x | y
--   --+----
--   5 | 77

Bei dieser Gelegenheit soll erwähnt werden, dass man auch Tabellennamen als Typen verwenden kann. Im Unischema gibt es die Tabellen professoren und pruefen, also kann man auch die entsprechenden Typen benutzen:

CREATE OR REPLACE FUNCTION getpruefer(pr pruefen) RETURNS professoren AS $$
  SELECT p.* FROM professoren p WHERE p.persnr = pr.persnr
$$ LANGUAGE SQL;

SELECT getpruefer(pr) FROM pruefen pr;

Wenn Sie auf Felder des zurückgegebenen Professors zugreifen wollen, müssen Sie zusätzlich den Funktionsaufruf einklammern:

SELECT (getpruefer(pr)).name FROM pruefen pr;

Table Functions

Funktionen können auch ganze Tabellen zurückgeben. Dazu gibt es zwei Möglichkeiten. Die erste ist eine Menge von Tupeln eines bestimmten Datentyps zu spezifizieren:

CREATE OR REPLACE FUNCTION k_juengste_studenten(k integer) RETURNS SETOF studenten AS $$
  SELECT * FROM studenten ORDER BY semester ASC LIMIT k
$$ LANGUAGE SQL;

SELECT * FROM k_juengste_studenten(4);

Die zweite Möglichkeit ist, ein neues Tabellenformat durch Spalten mit jeweils Namen und Typ anzugeben:

CREATE OR REPLACE FUNCTION xyz(k integer) RETURNS TABLE(g bigint, matrnr integer) AS $$
  SELECT rank() OVER (ORDER BY semester, matrnr), matrnr FROM studenten
$$ LANGUAGE SQL;

SELECT * FROM xyz(1);

Aufgaben

Schreiben Sie die Funktion anrede(sem INT, formel1 VARCHAR, formel2 VARCHAR) die eine Tabelle mit einer Spalte Anredeformeln zurückgibt. Dabei soll für Studenten mit einer Semesterzahl <= sem formel1 benutzt werden, sonst formel2. Als Rückgabetyp müssen Sie eine Tabelle analog zum "CREATE TABLE"-Statement spezifizieren allerdings ohne Constraints. Beispielausgabe:

Anrede
Hallo Hans,
Guten Tag Edith,

Tip: Sie erinnern sich sicher daran, dass man Strings mit dem ||-Operator konkatenieren kann.

Schreiben Sie danach die Funktion anrede so um, dass sie als Eingabe einen Eintrag der Tabelle Studenten nimmt und die passende Anrede zurück gibt.

results matching ""

    No results matching ""