Aujourd'hui, en exécutant des requêtes SQL sur une base Oracle 10g, j'ai été confronté à un léger soucis...
J'essayais de lancer un UPDATE sur une table dont un des champs est de type VARCHAR2. Je voulais donc mettre à jour ce champ avec une chaîne de caractères contenant le caractère &. Mon ordre SQL intégré dans un bloc PL/SQL ressemblait à ça:
BEGIN
UPDATE TABLE
SET CHAMP = 'blablabla... blablablabla...'
WHERE ID = toto;
END;
/
Or à l'exécution de la requête, que ce soit sous
SQL Plus ou
Toad (ou tout autre client Oracle), Oracle me demande d'entrer une valeur pour
nbsp; :/
Ainsi, chaque occurence de &xxx dans un ordre SQL quelconque (SELECT, UPDATE, INSERT, DELETE, ...) est considérée comme un paramètre à passer à la requête. Soit, mais comment faire pour pouvoir utiliser ce caractère comme un caractère normal et non comme un caractère spécial ?
Pour cela, deux solutions:
- La 1ère consiste à définir le paramètre DEFINE à OFF au début du script SQL. Par exemple:
SET DEFINE OFF;
BEGIN
UPDATE TABLE
SET CHAMP = 'blablabla... blablablabla...'
WHERE ID = toto;
END;
/
- La 2ème est d'utiliser la concaténation de chaîne et de couper la chaîne en question juste après chaque occurence de &. En effet, si il est placé en fin de chaîne, Oracle ne l'interprètera pas en tant que caractère spécial ! Ce qui donnerait dans notre cas:
BEGIN
UPDATE TABLE
SET CHAMP = 'blablabla... &' || 'nbsp; blablablabla...'
WHERE ID = toto;
END;
/
Cette 2nde solution a l'avantage de ne pas obliger à redéfinir un paramètre qui pourrait avoir des effets de bord ultérieurs...