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.

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


60

|| chr(38) ||

Cette solution est parfaite.


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 


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=');

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;

4

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


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.


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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.