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

zurück zum Seitenanfang

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)) 

zurück zum Seitenanfang

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.

zurück zum Seitenanfang

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 >>