• Prozeduren tun etwas
  • Funktionen (UDF) liefern einen Ergebniswert
  • Tabellenfunktionen liefern eine Tabelle
  • Methoden gehören zu einem User-defined Datatype (brauchen wir nicht)

Routinen haben einen Namen und Eingangsparameter
Sie landen im DBeaver Schema im Ordner “Funktionen”

PL/pgSQL

Block:

[ DECLARE
]
BEGIN
 
END

Kontrollstrukturen:

IF ... THEN ... [ELSE ...] END IF;
WHILE ... LOOP END LOOP;
FOR ... IN ... .. ... LOOP ... END LOOP;
FOR ... IN 'SELECT ...' LOOP ... END LOOP;
  • Good Practice: Variablennamen mit einem Unterstrich prefixen, dann kann man Variablen und Tabellenspalten besser auseinanderhalten

CREATE OR REPLACE FUNCTION

CREATE OR REPLACE FUNCTION alles_leeren() RETURNS void AS
$$ BEGIN
	TRUNCATE bewertungen CASCADE;
	TRUNCATE produkte CASCADE;
	...
END $$ LANGUAGE plpgsql;

Aufrufen mit: (PostgreSQL)

SELECT alles_leeren();
  • $$ bedeutet, zwischen den $$ kommen Statements die zwar mit ; enden, aber nicht die Funktion beenden

Variablen

CREATE OR REPLACE FUNCTION ... RETURNS void AS $$
DECLARE
x INT := 5;
BEGIN
-- ...
END $$ LANGUAGE plpgsql;

RAISE NOTICE

Gibt einen Infotext auf der Konsole aus

RAISE NOTICE 'Hallo!!!';
RAISE NOTICE 'Variable x hat den Wert %', x;

Variablen ausgeben:

-- ...
$$
DECLARE
x INT;
BEGIN
	x := 4;
	RAISE NOTICE 'Hallo, x ist %', x;
-- ...

Stored Procedures

CREATE PROCEDURE prozedur(_variable) AS $$
DECLARE ...
BEGIN
 
-- Zugriff auf Variablen:
 
-- Entweder per Name:
_variable
 
-- Oder per Position
$1
 
END $$ LANGUAGE plpgsql

CALL

CALL prozedur(123);

SELECT INTO

 

Tabellenfunktionen

Der Rückgabetyp von Funktionen kann auch TABLE sein, dann wird eine Tabelle zurückgegeben

Exceptions werfen und behandeln

RETURN 10/0; -- division durhc 0 wirft fehler
EXCEPTION WHEN OTHERS THEN -- catch
	RAISE EXCEPTION 'Division durch 0'; -- Eigene Exception werfen

Volatiläts-Kategorien

  • VOLATILE (Standard) - Funktion darf alles: DB verändern und bei gleichen Parametern unterschiedliche Ergebnisse liefern
  • STABLE - Funktion darf die DB nicht verändern und muss innerhalb den gleichen Statements bei gleichen Parameterwerden das gleiche Ergebnis liefern
  • IMMUTABLE - Funktion darf die DB nicht verändern und muss bei gleichen Parametern das gleichen Ergebnis liegern
CREATE FUNCTION addieren(int, int) 
...
LANGUAGE plpgsql IMMUTABLE;