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