FreeAdhocUDF für InterBase und FireBird in deutschin englishen françaisen españolin italianoa português
homeprevious pageÜbersicht • overview • aperçunext pagelast page Seite empfehlen • advice website •Forum Mailing-Liste • mailinglist • liste de diffusionwas ich vermisse • what I missed •eMail Kommentar • eMail commentprintsitemap
Vorbemerkung

Es gibt (u.a.) unterschiedliche Limits in InterBase und FireBird sowie in deren Versionen, sprich jede einzelne Spalte eines SQLs darf nicht mehr als das Spalten-Limit UND die Zeile, also der komplette Datensatz des SQLs nicht mehr als das Zeilen-Limit ergeben.
Zum Zeilen-Limit werden alle Ausgabe-Spalten mit deren DEFINIERTEM Wert zusammengerechnet, also nicht mit dem Wert des FeldINHALTes:
- ein Datenbankfeld mit seinem definiertem Wert - z.B. VARCHAR(100), 2 Bytes für SMALLINT etc.
- eine UDF mit dem definierten Rückgabewert - z.B. 100 Bytes für ... RETURN VARCHAR(100) ...
- eine StoredProcedure dto.
                            column limit      row limit
                            Spalten-Limit   Zeilen-Limit
InterBase 6.02        32 kB           32 kB
InterBase 7.x          32 kB           64 kB
FireBird 1.x            32 kB           32 kB
FireBird 2.x            32 kB           40 kB
Damit z.B. folgende Konstruktion funktioniert:
select F_REPLACE(F_REPLACE(F_REPLACE(F_REPLACE(‘abcdefg’, ‘a’, ‘x‘), ‘b’, ‘y’), ‘c’, ‘z’), ‘d’, ‘-‘) from TABLE ... muß die DEFINITON für F_REPLACE wie folgt aussehen:
DECLARE EXTERNAL FUNCTION F_REPLACE
    CSTRING(8190),
    CSTRING(254),
    CSTRING(254)
    RETURNS CSTRING(8190) FREE_IT
    ENTRY_POINT 'replace' MODULE_NAME 'FreeAdhocUDF';
darf der “RETURNS CSTRING(8190)” nicht mehr als 8190 sein, weil in EINER Spalte EINE Funktion 4-fach verschachtelt ist -> 4*8190 = 32760
Soll mein SQL außerdem noch eine Tabellen-Spalte erhalten, also z.B.
Select SPALTE, F_REPLACE(F_REPLACE(F_REPLACE(...
darf bei obiger Definition (8190) das F_REPLACE nur DREI mal verschachtelt auftreten, damit das Limit “32 kB pro Datensatz” nicht überschritten wird, weil bei 4-fach verschachtelt schon 32 kB für diese Spalte das Datensatz-Limit erreicht hätte.
Da es in einem Projekt aber verschiedenste Bedingungen für die einzelnen UDFs gibt, ist es eine Möglichkeit, GLEICHE UDFs mehrfach zu definieren:
- F_REPLACE mit RETURN CSTRING(254)
- F_REPLACE4 mit RETURN CSTRING(4095)
- F_REPLACE8 mit RETURN CSTRING(8190)
- F_BIGREPLACE mit RETURN CSTRING(32760)
Nun hat mal “für alle Gelegenheiten” die richtige Funktion zur Verfügung.
vorige Seite • previous page • passée sitenach oben • go top • vers le hautnächste Seite • next page • prochain site