Caractère d'échappement Oracle SQL (pour un '&')

86

Tout en essayant d'exécuter des instructions d'insertion SQL à l'aide d' Oracle SQL Developer, je continue de générer une invite "Enter substitution value":

insert into agregadores_agregadores 
(
 idagregador,
 nombre,
 url
) 
values 
(
 2,
 'Netvibes',
 'http://www.netvibes.com/subscribe.php?type=rss\&url='
);

J'ai essayé d' échapper au caractère spécial dans la requête en utilisant le '\' ci-dessus mais je ne peux toujours pas éviter l'esperluette, '&', provoquant une substitution de chaîne.

ian_scho
la source

Réponses:

125

le & est la valeur par défaut de DEFINE, qui vous permet d'utiliser des variables de substitution. J'aime l'éteindre en utilisant

SET DEFINE OFF

alors vous n'aurez plus à vous soucier de vous échapper ou de CHR (38).

Neil Kodner
la source
60

|| chr(38) ||

Cette solution est parfaite.

Aseem
la source
2
Cela fait le travail, mais est un peu maladroit lorsqu'il s'agit de chaînes préexistantes.
aglassman
Pour moi, SET DEFINE OFF n'a pas fonctionné. Votre solution fonctionnera. Merci ...
Ashok kumar
31

Définissez le caractère de définition sur autre chose que &

RÉGLER DÉFINIR ~
créer une table bla (x varchar (20));
insérer dans les valeurs blah (x) ('blah & amp');
sélectionnez * de bla;

X                    
-------------------- 
bla & amp 

RC.
la source
27
ou SET DEFINE OFF
dpbradley
15
insert into AGREGADORES_AGREGADORES (IDAGREGADOR,NOMBRE,URL)
values (2,'Netvibes',
'http://www.netvibes.com/subscribe.php?type=rss' || chr(38) || 'amp;url=');
Jeffrey Kemp
la source
Merci à Jeffrey Kemp pour avoir fourni une solution avec || chr (38) ||
C'est une bien meilleure solution générale qui est indépendante des privilèges de l'utilisateur (c'est-à-dire lorsque les utilisateurs ne sont pas autorisés à SET DEFINE OFF) et lorsque les utilisateurs veulent spécifier à la fois une esperluette dans le texte et des variables définies dans la même commande SQL.
Analyse floue
12
SELECT 'Free &' || ' Clear' FROM DUAL;
drj
la source
4

select 'one'||'&'||'two' from dual

Izo
la source
L'esperluette ne doit être qu'à la fin de la chaîne, ce qui économise la moitié de la concaténation. select 'one&' || 'two' from dual
durette
1

La vraie réponse est que vous devez définir le caractère d'échappement sur '\': SET ESCAPE ON

Le problème peut s'être produit soit parce que l'échappement a été désactivé, soit parce que le caractère d'échappement a été défini sur autre chose que «\». L'instruction ci-dessus activera l'échappement et le définira sur '\'.


Aucune des autres réponses publiées précédemment ne répond réellement à la question d'origine. Ils contournent tous le problème mais ne le résolvent pas.

Terrible têtard
la source
4
J'ai lu sur Ask Tom ( asktom.oracle.com/pls/asktom/… ) que "SET ESCAPE est un sqplus'ism". Ce ne serait donc la vraie réponse que si la question portait sur SQL * Plus.
Karl Kieninger
-1

ajoutez ceci avant votre demande

set define off;
Helali
la source