Stored Funktionen
<< Index/Indizes | IBExpert | Firebird 3.0 USAGE Privilegien >>
Die deutschsprachige Dokumentation wird seit dem 26. Juli 2016 nicht mehr gepflegt. Aktuelle und vollständige Dokumentation finden Sie auf der englischsprachigen Webseite: IBExpert Documentation
Stored Funktionen
Folgendes ist ein Auszug aus dem The Firebird 3.0 Release Notes (29. November 2014 - Dokument v.0300-16 - für Firebird 3.0 Beta 1) Kapitel, PSQL Stored Functions:
PSQL Stored Funktionen
Dmitry Yemanov
Nun ist es möglich, Skalarfunktionen in PSQL zu schreiben, und sie wie eine interne Funktion zu rufen.
Syntax für DDL
{CREATE [OR ALTER] | ALTER | RECREATE} FUNCTION <name> [(param1 [, ...])] RETURNS lt;type> AS BEGIN ... END
Tipp: Die CREATE
Anweisung ist der Deklarationssyntax für PSQL Funktionen, parallel zu DECLARE
für Legacy-UDFs.
Beispiel
CREATE FUNCTION F(X INT) RETURNS INT AS BEGIN RETURN X+1; END; SELECT F(5) FROM RDB$DATABASE;
Quelle: Firebird 3.0 Release Notes von Helen Borrie (Collator/Editor): 29. November 2014 - Dokument v.0300-16 - für Firebird 3.0 Beta 1
Stored Funktionen Editor
Seit IBExpert version 2014.03.16 werden bereits einige Stored Funktionen-Features unterstützt. Der Stored Funktionen-Editor bietet bereits folgende Features:
- IBExpert Version 2014.03.16: Der Funktionen-Editor erlaubt die Erzeugung und das Editieren von Stored Funktionen bei der Arbeit mit Firebird 3 Datenbanken.
- IBExpert Version 2014.03.16: Unterstützung der
CREATE/ALTER/RECREATE/DROP/COMMENT FUNCTION
-Anweisungen und Versionshistorie für Stored Funktionen. - Auch neu in IBExpert version 2014.03.16: Der Rechtemanager, die Automatische Rechtezuweisung und der PSQL Parser unterstützen Stored Funktionen.
- Lazy Mode und Rechte-Seite implementiert in IBExpert Version 2014.06.17.
- Stored Funktionen-Ausführung implementiert in IBExpert Version 2014.06.17.
- Blocks wurden in IBExpert Version 2014.12.17 für das Kopieren von Packages und Stored Funktionen hinzugefügt.
- Seit IBExpert Version 2015.12.21 werden Firebird 3.0 Funktionen von IBExpert voll unterstützt.
Das Problem mit dem inkorrekten Objekttyp (Wert 1 wurde verwendet, der gleiche Wert, der für Prozeduren benutzt wurde) für die Versionsregistrierung von Stored Funktionen in der IBE$VERSION_HISTORY
-Tabelle wurde in IBExpert Version 2016.06.19 behoben. Seit dieser Version wurde der Wert auf 4 geändert.
Um bereits erstellte Datensätze mit einem falschen Objekttyp zu berichtigen, führe Sie bitte foldenden UPDATE
aus:
update IBE$VERSION_HISTORY vh set vh.ibe$vh_object_type = 4 where (vh.ibe$vh_object_type = 1) and (exists(select f.rdb$function_name from rdb$functions f where f.rdb$function_name = vh.ibe$vh_object_name))
Warum sollen Sie Firebird Stored Funktionen verwenden?
Prozeduren und Stored Funktionen sind technisch identisch. Allerdings gibt es ein paar Gründe, warum Sie Stored Funktionen statt Prozeduren verwenden sollten:
Einfacher als Prozeduren aufzurufen
Stored Funktionen sind leichter als Prozeduren aufzurufen. Zum Beispiel:
Beispiel einer Prozedur:
select name, (select res from sp(kunde.name)) res from kunde
Beispiel einer Stored Funktion:
select name, sf(kunde.name) res from kunde
Flexibler als Prozeduren
Stored Funktionen bieten auch wesentlich mehr Flexibilität, beispielsweise wenn sie in eine where
Bedingung aufgerufen werden:
select ... where brpsoundex(kunde.name,'ENG')='K123'
Solche Verschachtelungen in Prozeduren können schnell sehr unübersichtlich werden.
Beispiel mit Soundex
Um Firebird 3.0 Stored Funktionen zu demonstrieren, haben wir Soundex verwendet. Soundex sucht nach ähnlich klingenden Wörter. Falls Sie noch nicht mit Soundex vertraut sind, bitte biziehen Sie sich zuerst auf die Wikipedia-Definition: https://de.wikipedia.org/wiki/Soundex.
Um die Soundex-Funktionalität besser zu verstehen, haben wir eine Soundex Prozedur IBESOUNDEX
als einfache Implementation mit 3 Parametern für das Wort, die Sprache und die String-Länge erstellt:
Wenn wir sie starten, und das Wort, das wir suchen eingeben - hier KLEMT
und die Sprache GER
, ist das Ergebnis K453
.
Die Ergebnisse beziehen sich immer auf Gruppen von ähnlich klingenden Buchstaben, und die Gruppen für die SOUNDEX
-Funktionalität stammen aus einer Bibliothek. Hier haben wir auch eine Implementation für die deutsche Sprache, die IBESOUNDEXWEIGHT
Bibliothek, verwendet.
Das erste Zeichen wird immer direkt verwendet, der Buchstabe L
ist zum Beispiel die Ziffer 4
; E
die Ziffer 7
, M
hat die Ziffer 5
und T
die Ziffer 5
.
Wenn ich das deutsche Wort Maier
eingebe, ist das Ergebnis M760
. Es kann auch Mayer
buchstabiert werden. Wieder M760
. Und Meier
= M760
. Sie erhalten immer das gleiche Ergebnis, weil die Namen gleich klingen, auch wenn etwas anders geschrieben.
Das Problem mit dieser Art der Implementierung ist, dass es sehr viel Zeit in Anspruch nehmen kann.
Also können Sie eine Funktion verwenden: Definieren Sie eine neue Funktion mit der gleichen Struktur, Wort, Sprache und String-Länge. Definieren Sie die Returns als no name, varchar (1000)
und dann führen Sie die gleiche Prozedur aus:
create or alter function SOUNDEX ( WORD varchar(1000), LNG char(3), SLEN bigint = 4) returns varchar(1000) AS declare variable res varchar(1000); begin execute procedure ibesoundex(:word,:lng,:slen) returning_values res; return res; end
Mit diesem Statement können wir nun:
select soundex('Maier','GER',4) from rdb$database; -- result M760 select soundex('Meier','GER',4) from rdb$database; -- result M760 select soundex('Meyer','GER',4) from rdb$database; -- result M760 select soundex('Mayer','GER',4) from rdb$database; -- result M760
oder
select customer.lastname, soundex(customer.lastname,'GER',4) from customer;
Es gibt viele mögliche Implementierungen hierfür, für interne Bug-Management, Datenauswertung und so weiter.
Mit einer einfachen SQL können wir alle Namen in einer Datenbank, nach Ähnlichkeit gruppiert, anzeigen:
select soundex(customer.lastname, 'ENG', 5), count(*), list (distinct customer.lastname) from customer group by 1 order by 2 desc
Hier können wir die Anzahl der gefundenen Namen entsprechend der Soundex-Gruppe ansehen:
Zum Beispiel, paul
, pillai
, poole
, powell
, pulley
, pywell
. Oder barone
, barron
usw. Sie klingen alle ähnlich.
Diese Implementation kann sehr nützlich sein, auch wenn es gelegentlich einige überraschende Ergebnisse anzeigt.
Sie sehen also, die interne Funktion macht die Implementation viel einfacher. Sie können sogar mit dieser Funktionalität Ihre Daten indizieren.
Wir finden Stored Funktionen ein wirklich tolles neues Feature, denn sie bieten in der Datenbank eine Vielzahl von Möglichkeiten. Wir hoffen, Sie auch!
zurück zum Seitenanfang
<< Index/Indizes | IBExpert | Firebird 3.0 USAGE Privilegien >>