- 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
ENDKontrollstrukturen:
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 plpgsqlCALL
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 werfenVolatilä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;