J'y arrive en 5 requêtes successives:
DECLARE EXTERNAL FUNCTION LOWER2
CSTRING(255) CHARACTER SET ISO8859_1
RETURNS CSTRING(255) CHARACTER SET ISO8859_1 FREE_IT
ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf';
DECLARE EXTERNAL FUNCTION SUBSTR2
CSTRING(255) CHARACTER SET ISO8859_1, SMALLINT, SMALLINT
RETURNS CSTRING(255) CHARACTER SET ISO8859_1 FREE_IT
ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';
update MULTIMEDIA
set MULTI_PATH=SUBSTR2 ( MULTI_PATH , 1 , STRLEN ( MULTI_PATH )-3)
||LOWER2 ( SUBSTR2 ( MULTI_PATH , STRLEN ( MULTI_PATH ) -2 , STRLEN ( MULTI_PATH )));
DROP EXTERNAL FUNCTION LOWER2;
DROP EXTERNAL FUNCTION SUBSTR2;
Dans le BOA, il faut les exécuter une par une, et à la fin de chacune il y a une erreur (lecture adresse 000...) non bloquante. Avec IBOconsole je les fais toutes ensembles (Auto Commit activé).
Les 2 premières requêtes ont pour but de créer des fonctions LOWER2 et SUBSTR2 identiques aux LOWER et SUBSTR existantes mais capables de travailler sur des chaînes de 255 caractères
La troisième met en minuscules les 3 derniers caractères du champ MULTI_PATH.
Les 2 dernières suppriment les 2 fonctions LOWER2 et SUBSTR2, mais je ne pense pas qu'il y ait d'inconvénients à garder ces fonctions pour une utilisation ultérieure, bien que je préfèrerai que les LOWER et SUBSTR actuelles soient modifiées.
Pour ceux qui seraient tentés par l'expérience, n'oubliez pas la sauvegarde préalable de la base.
A+
André
PS: réédition du 01/02/2006: A partir de la version b4.04 de la base, les fontions externes de chaîne de caractères supportent jusqu'à 255 caractères. Il n'est donc plus nécessaire de créer les fonctions avec le "2".