Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird Embeded UDF einbinden (https://www.delphipraxis.net/216308-firebird-embeded-udf-einbinden.html)

tkhandel 7. Dez 2024 13:20

Datenbank: Firebird • Version: 5. • Zugriff über: Delphi

Firebird Embeded UDF einbinden
 
Hallo,
ich benötige eine functionen wie length usw. direkt in der DB
Wie kann ich die udf in einer Firebird Embeded DB einbinden ?

Klaus01 7. Dez 2024 13:42

AW: Firebird Embeded UDF einbinden
 
.. so weit ich weiß, unterstützt FB 5 keine UDFs mehr.


Vielleicht kannst Du etwas von den internen Funktionen nutzen: https://www.firebirdsql.org/refdocs/...5-intfunc.html

Grüße
Klaus

tkhandel 7. Dez 2024 18:14

AW: Firebird Embeded UDF einbinden
 
Danke, ja das wird es wohl sein versuche es mal anders zu lösen
eigentlich gingh es darum herauszufinden wie lang ein string und wenn zu kurz dann auffüllen mit führenden Nullen

Delphi.Narium 7. Dez 2024 18:51

AW: Firebird Embeded UDF einbinden
 
Linksbündig auffüllen:
SQL-Code:
select LPad(Spalte,Laengenangabe,ZeichenZumAuffuellen) from tabelle
SQL-Code:
select LPad(Spalte,25,' ') from tabelle
füllt die Spalte auf 25 Zeichen linksbündig mit Leerzeichen auf.

Rechtsbündig auffüllen:
SQL-Code:
select RPad(Spalte,Laengenangabe,ZeichenZumAuffuellen) from tabelle
SQL-Code:
select LPad(Spalte,25,' ') from tabelle
füllt die Spalte auf 25 Zeichen rechtsbündig mit Leerzeichen auf.

Die Länge einer Zeichenfolge erhälst Du mit CHAR_LENGTH(), CHARACTER_LENGTH().

SQL-Code:
select Spalte, char_length(Spalte), LPad(Spalte,25,' '), char_length(LPad(Spalte,25,' ')), RPad(Spalte,25,' '), char_length(RPad(Spalte,25,' ')) from tabelle

jaenicke 7. Dez 2024 18:59

AW: Firebird Embeded UDF einbinden
 
Zitat:

Zitat von Klaus01 (Beitrag 1543996)
.. so weit ich weiß, unterstützt FB 5 keine UDFs mehr.

Dafür gibt es seit Firebird 3 User-Defined Routines (UDR). Das ist am Ende sehr ähnlich (auch wieder angebundene DLLs, die die Funktionen zur Verfügung stellen), nur technisch besser umgesetzt und an Firebird angepasst (Rechtemodell, ...). Damit kann man deutlich mehr machen als mit den alten UDFs.

Man kann damit bestehende UDFs aber oft 1:1 ersetzen.

IBExpert 8. Dez 2024 06:44

AW: Firebird Embeded UDF einbinden
 
Zitat:

Zitat von Klaus01 (Beitrag 1543996)
.. so weit ich weiß, unterstützt FB 5 keine UDFs mehr.
Vielleicht kannst Du etwas von den internen Funktionen nutzen: https://www.firebirdsql.org/refdocs/...5-intfunc.html

Doch, UDFs gehen auch noch bis mindestens fb5, aber um die zu nutzen muss man die in der firebird.conf exlizit erlauben.

Es ist aber eindeutig empfohlen, UDFs nicht zu nutzen, weil sehr viele existierende erschreckend schlecht programmiert
sind und bei multithreaded load wegen speicherfehler gerne mal den gesamten prozess per access violation zum Absturz
bringen.

Das versuchen dann einige zu umgehen, in dem man den classic server nimmt, weil da jede Prozess single threaded
ist und damit die multithread probleme vermieden werden. Das der classic andere erhebliche Nachteile hat wird dann oft
zugunsten der ansonsten nicht mehr gegebenen Stabilität gerne von Softwareherstellern auf den Kunden abgewälzt (langsamer
weil weit mehr I/O Leistung erforderlich).

Wenn man interne Funktionen findet, die den gleichen Zweck erfüllen, ist ein Umstieg darauf mit Abstand der beste Weg. Sollte
die Syntax der Funktion aber anders sein, wie zum beispiel bei substring('ABCD' from 2 for 2) auf eine bisher benutzte UDF
substr('ABCD*,2,2) kann man seit fb3 sigenannte Stored functions erstellen, die syntaxgleich das machen, was man vielleict
im Laufe von Jahrzehnten im eigenen Quellcode an hundersten stellen verteilt hat und da nicht mal eben ändern kann.

UDR sind ähnlich wie UDF, müssen aber anders compiliert sein,weil deren Einbindung auch bei schlechter Implementation
nicht den gesamten Serverprozess zum Absturz bringen. Frei verfügbare UDR Bibliothen sind aber noch rar, aber aufgrund
der sehr vielen internen frei verfügbaren robusten Funktionen längst nicht mehr so oft erforderlich.

Wer also noch seine Software zum Beispiel mit der extrem gruseligen FreeAdHocUDF (oder auch rfunc) Lib verheiratet hat,
dem sei dringend der Umstieg angeraten. Die Freeadhoc hatte ihr letztes Update vor 14 Jahren! Und auf begründete Nachfrage
liefer ich einige simple SQL Befehle, die mit aufrufen der darin enthaltenen Funktionen mit bestimmten parametern garantiert
jeden Serverrozess abstürzen lässt, der die udf eingebunden hat.

Für diverse Kunden haben wir die Funktionen mal zu stored functions auf Basis derinternen Funktionen portiert und bieten
das auch anderen an https://ibexpert.net/cms/ibexpertfunctionlibrary

Bei den meisten Projekten, wo wir den Umstieg von fb<025 auf fb>=30 per Hotline Support/Workshop unterstützt habe, war oft
eine simple Inventur hilfreich. Nur weil 600 Ufs in der Datenbank deklariert sind, heisst das noch lange nicht das die auch
wirklich alle benutzt werden oder ha jemand von euch schon mal ernsthaft die FreeAdhocUDF Funktionen benutzt, ohne dafür
Standortbezogene Kalender zu implementieren

F_ASCHERMITTWOCH
F_FRONLEICHNAM
F_GRUENDONNERSTAG
F_HIMMELFAHRT
F_KARFREITAG
F_KARNEVALSDIENSTAG
F_OSTERDATUM
F_OSTERMONTAG
F_OSTERSAMSTAG
F_PALMSONNTAG
F_PFINGSTMONTAG
F_PFINGSTSONNTAG
F_ROSENMONTA
F_ROSENMONTAG
F_WEIBERFASTNACHT

Nur weil die im Init Script stehen sollte man die nicht deklarieren und über dependencies bekommt man die wenn die wirklich in der
Datenbank selber in trigger oder stored procs benutzt wurden, finden und hinterfragen.

Oder wieder zurück zum Thema: wis schon angesagt von anderen:
für Stringlänge nimm die interne Funktion char_length (die es auch schon bei fb25 gab)

Ergänzend: Wenn du einen andere Syntax brauchst als die der internen Funktionen, baue dafür stored functions auf basis der internen funktionen.

Frickler 9. Dez 2024 11:21

AW: Firebird Embeded UDF einbinden
 
Vom Autor der IBX2 Bibliothek für Lazarus gibt es eine Anleitung für das Schreiben von UDRs mit FreePascal und Delphi.
Für den Fall, dass das Richtige nicht dabei ist. Beispielsweise gibt es, wie Delphi.Narium schreibt, LPad und RPad, aber ein "MPad" fehlt (kann man natürlich auch als "Stored Function" was basteln...).


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz