AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird Embeded UDF einbinden
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Embeded UDF einbinden

Ein Thema von tkhandel · begonnen am 7. Dez 2024 · letzter Beitrag vom 9. Dez 2024
Antwort Antwort
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
89 Beiträge
 
Delphi 10.4 Sydney
 
#1

Firebird Embeded UDF einbinden

  Alt 7. Dez 2024, 14:20
Datenbank: Firebird • Version: 5. • Zugriff über: Delphi
Hallo,
ich benötige eine functionen wie length usw. direkt in der DB
Wie kann ich die udf in einer Firebird Embeded DB einbinden ?
Jürgen
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Firebird Embeded UDF einbinden

  Alt 7. Dez 2024, 14:42
.. 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
Klaus
  Mit Zitat antworten Zitat
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
89 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Firebird Embeded UDF einbinden

  Alt 7. Dez 2024, 19:14
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
Jürgen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: Firebird Embeded UDF einbinden

  Alt 7. Dez 2024, 19:51
Linksbündig auffüllen: select LPad(Spalte,Laengenangabe,ZeichenZumAuffuellen) from tabelle select LPad(Spalte,25,' ') from tabelle füllt die Spalte auf 25 Zeichen linksbündig mit Leerzeichen auf.

Rechtsbündig auffüllen: select RPad(Spalte,Laengenangabe,ZeichenZumAuffuellen) from tabelle 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().

select Spalte, char_length(Spalte), LPad(Spalte,25,' '), char_length(LPad(Spalte,25,' ')), RPad(Spalte,25,' '), char_length(RPad(Spalte,25,' ')) from tabelle
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Firebird Embeded UDF einbinden

  Alt 7. Dez 2024, 19:59
.. 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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
680 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Firebird Embeded UDF einbinden

  Alt 8. Dez 2024, 07:44
.. 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.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung

Geändert von IBExpert ( 8. Dez 2024 um 07:48 Uhr)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
599 Beiträge
 
Delphi XE6 Enterprise
 
#7

AW: Firebird Embeded UDF einbinden

  Alt 9. Dez 2024, 12:21
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...).

Geändert von Frickler ( 9. Dez 2024 um 12:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz