Управляющий символ Oracle SQL (для '&')


86

При попытке выполнить операторы вставки SQL с помощью Oracle SQL Developer я продолжаю генерировать запрос «Введите значение подстановки»:

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

Я пробовал экранировать специальный символ в запросе, используя "\" выше, но я все еще не могу избежать амперсанда "&", вызывающего подстановку строки.

Ответы:


126

& - это значение по умолчанию для DEFINE, что позволяет использовать переменные подстановки. Мне нравится выключать его с помощью

УСТАНОВИТЬ ОПРЕДЕЛЕНИЕ ВЫКЛ.

тогда вам не придется беспокоиться об экранировании или CHR (38).


60

|| chr(38) ||

Это решение идеальное.


2
Это выполняет свою работу, но это немного неудобно при работе с уже существующими строками.
aglassman 05

У меня SET DEFINE OFF не работал. Ваше решение сработало будет. Спасибо ...
Ашок Кумар

31

Установите для символа определения значение, отличное от &

УСТАНОВИТЬ ОПРЕДЕЛЕНИЕ ~
создать таблицу blah (x varchar (20));
вставить в значения blah (x) ('blah & amp');
выберите * из бла;

Икс                    
-------------------- 
бла & amp 


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

Спасибо Джеффри Кемпу за предоставление решения с || chr (38) ||

Это гораздо лучшее общее решение, которое не зависит от привилегий пользователя (т.е. когда пользователям не разрешено SET DEFINE OFF) и для случаев, когда пользователи хотят указать как амперсанды в тексте, так и определенные переменные в одной команде SQL.
Нечеткий анализ


4

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


Амперсанд должен стоять только в конце строки, экономя половину конкатенации. select 'one&' || 'two' from dual
durette

1

Настоящий ответ - вам нужно установить escape-символ на '\': SET ESCAPE ON

Проблема могла возникнуть из-за того, что экранирование было отключено, или для escape-символа было установлено значение, отличное от '\'. Приведенный выше оператор позволит экранировать и установит для него значение '\'.


Ни один из других ранее опубликованных ответов на самом деле не отвечает на исходный вопрос. Все они обходят проблему, но не решают ее.


4
Я прочитал на Ask Tom ( asktom.oracle.com/pls/asktom/… ), что «SET ESCAPE - это sqplus'ism». Так что это был бы настоящий ответ, только если бы вопрос касался SQL * Plus.
Карл Кенингер

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.