Warum PostgreSQL?
Eine lockere Zusammenstellung von Features – Benutzerdefinierte Funktionen. Teil 4
Benutzerdefinierte Funktionen
Sollten die zahlreichen im PostgreSQL-Basissystem implementierten SQL-Funktionen für den angedachten Anwendungsfall einmal nicht ausreichen, hat der ambitionierte Datenbankentwickler für die Implementierung benutzerdefinierter Funktionen („stored procedures“) die Auswahl aus ziemlich vielen Programmiersprachen. Sogar SQL selber ist möglich, daneben eine von Oracles PL/SQL inspirierte prozedurale Programmiersprache PL/pgSQL oder, neben vielen anderen, PL/Perl. Auch Liebhaber systemnaher Programmierung kommen mit in C geschriebenen Funktionen voll auf ihre Kosten. Selbst NoSQL-Features (mit PL/V8) oder auf komplexe Statistik hin optimierte Aktivitäten (mit PL/R) sind möglich. Wer in der langen Liste der Möglichkeiten seine Lieblingssprache nicht findet, hat die Möglichkeit für diese mit überschaubarem Aufwand (vom Aneignen des nötigen Know-Hows einmal abgesehen) einen so genannten Language-Handler zu implementieren, denn die dazu nötige API ist – dem Paradigma freier Software folgend – offen und gut dokumentiert. Anschließend steht der prozeduralen Datenbankprogrammierung auch in dieser Sprache nichts mehr im Wege.
Und weil alle Theorie grau ist, ein kleines Beispiel zur Demonstration wie einfach die Definition einer benutzerdefinierten Funktion sein kann, nachfolgend das DDL für eine Additionsfunktion:
CREATE FUNCTION fn_add( nr_1 NUMERIC, nr_2 NUMERIC ) RETURNS NUMERIC LANGUAGE SQL AS 'SELECT nr_1 + nr_2;';
Und weil PostgreSQL die Argumenttypen bei der Identifikation einer Funktion berücksichtigt, kann eine gleichnamige Funktion für Zeichenketten koexistieren (Stichwort: „überladen“):
CREATE FUNCTION fn_add( string_1 VARCHAR, string_2 VARCHAR ) RETURNS VARCHAR LANGUAGE SQL AS 'SELECT string_1 || string_2;';
Anschließend können beide Funktionien benutzt werden wie eingebaute SQL-Funktionen, und PostgreSQL entscheidet anhand der Argumenttypen welche der Funktionen jeweils verwendet werden muss:
SELECT fn_add( 27.8, -19 ) AS summe, fn_add( 'PostgreSQL ', 'ist wirklich gut!' ) AS verkettung;
Die Abfrage liefert das Ergebnis:
summe | verkettung -------+------------------------------ 8.8 | PostgreSQL ist wirklich gut! (1 Zeile)
Weitere Informationen zu PostgreSQL finden Sie hier.
Haben Sie Fragen rund um PostgreSQL? Unsere Experten helfen gerne weiter: postgresql@exirius.de
Part 5/10 – Extension, Common Table Expressions und rekursive Abfragen sowie PostGIS