FreeAdhocUDF pour InterBase et FireBird in deutschin englishen français
homeprevious pagecontentnext pagelast page Mailing-Liste • mailinglist • liste de diffusionwas ich vermisse • what I missed •eMail Kommentar • eMail commentprint
Avertissement

Il y a des différences de limites entre Interbase et Firebird et aussi entre leurs versions. Chaque champ d’une requête SQL doit respecter la limite des champs ET l’enregistrement complet de la requête ne peut dépasser la limite d’un enregistrement.
Le calcul de la limite d’un enregistrement s’opère par l’addition des dimensions spécifiées pour les champs et non par les dimensions des valeurs contenues dans ces champs:
- un champ de table avec sa définition, par exemple VARCHAR(100), 2 by tes pour SMALLINT, etc.
- une fonction UDF avec une valeur de retour, par exemple 100 bytes pour … RETURN VARCHAR(100) …
- une procédure stoquée, idem.
                            column limit    row limit
                            limite de champ    limite d’enregistrement
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
Pour que la requête de l’exemple suivant puisse fonctionner:
select F_REPLACE(F_REPLACE(F_REPLACE(F_REPLACE(‘abcdefg’, ‘a’, ‘x‘), ‘b’, ‘y’), ‘c’, ‘z’), ‘d’, ‘-‘) from TABLE ...la définition (DECLARE) de F_REPLACE doit être la suivante:
DECLARE EXTERNAL FUNCTION F_REPLACE
    CSTRING(8190),
    CSTRING(254),
    CSTRING(254)
    RETURNS CSTRING(8190) FREE_IT
    ENTRY_POINT 'replace' MODULE_NAME 'FreeAdhocUDF';
"RETURNS CSTRING(8190)" ne peut plus être 8190, car un champ se reproduit par 4 fois par récurrence --> 4 * 8190 = 32760.
La requête doit en particulier comprendre un champ, comme par exemple Select CHAMP, F_REPLACE(F_REPLACE(F_REPLACE(... de telle sorte que la requête initiale avec une définition de 8190 n’aura plus recours par récurrence que 3 fois à F_REPLACE. Ainsi la limite de 32 kB de l’enregistrement ne sera pas dépassée, alors que 4 fois aurait conduit à un dépassement des 32 kB.
Comme une application peut vomprendre plusieurs contraintes pour une seule fonction UDF, une possibilité est de déclarer plusieurs fois la même fonction:
- F_REPLACE avec RETURN CSTRING(254)
- F_REPLACE4 avec RETURN CSTRING(4095)
- F_REPLACE8 avec RETURN CSTRING(8190)
- F_BIGREPLACE avec RETURN CSTRING(32760)    
Ainsi on dispose pour toutes les conditions de la fonction correcte.
vorige Seite • previous page • passée sitenach oben • go top • vers le hautnächste Seite • next page • prochain site