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.