Как вставить строку, которая содержит «&» - PullRequest
36 голосов
/ 30 сентября 2008

Как мне написать оператор вставки, который включает символ &? Например, если я хотел вставить «J & J Construction» в столбец в базе данных.

Я не уверен, имеет ли это значение, но я использую Oracle 9i.

Ответы [ 14 ]

57 голосов
/ 04 января 2009

Я продолжаю забывать об этом и возвращаюсь к нему снова! Я думаю, что лучший ответ - это комбинация предоставленных ответов.

Во-первых, & является префиксом переменной в sqlplus / sqldeveloper, поэтому проблема заключается в том, что когда он появится, ожидается, что он будет частью имени переменной.

SET DEFINE OFF остановит интерпретацию sqlplus и так далее.

Но что, если вам нужно использовать переменные sqlplus и литерал & символы?

  • Вам нужно установить SET DEFINE ON, чтобы переменные работали
  • И SET ESCAPE ON, чтобы избежать использования &.

, например

set define on
set escape on

define myvar=/forth

select 'back\\ \& &myvar' as swing from dual;

Производит:

old   1: select 'back\\ \& &myvar' from dual
new   1: select 'back\ & /forth' from dual

SWING
--------------
back\ & /forth

Если вы хотите использовать другой escape-символ:

set define on
set escape '#'

define myvar=/forth

select 'back\ #& &myvar' as swing from dual;

Когда вы устанавливаете определенный escape-символ, вы можете увидеть «SP2-0272: escape-символ не может быть буквенно-цифровым или пробелом». Это, вероятно, означает, что вы уже определили escape-символ, и все становится ужасно самоссылочным. Чистый способ избежать этой проблемы - сначала запустить escape:

set escape off
set escape '#'
16 голосов
/ 30 сентября 2008

Если вы делаете это из SQLPLUS, используйте

SET DEFINE OFF  

чтобы остановить его и как особый случай

10 голосов
/ 12 апреля 2013

Альтернативное решение, используйте конкатенацию и функцию chr:

select 'J' || chr(38) || 'J Construction' from dual;
5 голосов
/ 04 января 2009

Всегда есть функция chr (), которая преобразует код ascii в строку.

т. что-то вроде: ВСТАВИТЬ В Таблица ЦЕННОСТИ ( КОНКАТ («J», CHR (38), «J») )

5 голосов
/ 30 сентября 2008

Правильный синтаксис:

set def off;
insert into tablename values( 'J&J');
4 голосов
/ 30 сентября 2008

В программе всегда используйте параметризованный запрос. Это позволяет избежать атак SQL-инъекций, а также любых других символов, специфичных для анализатора SQL.

4 голосов
/ 30 сентября 2008
2 голосов
/ 22 января 2018
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')

Вывод этого запроса: Jonhy's Sport & Fitness

2 голосов
/ 06 апреля 2016

Вы можете вставить такую ​​строку как 'J' || '&' || 'Construction' . Работает нормально.

insert into table_name (col_name) values('J'||'&'||'Construction');
2 голосов
/ 30 сентября 2008

Я обнаружил, что работает любой из следующих параметров:

SET DEF OFF

или

SET SCAN OFF

Я не знаю достаточно о базах данных, чтобы знать, лучше ли одна или "правильнее", чем другая. Кроме того, если есть что-то лучше, чем любой из них, пожалуйста, дайте мне знать.

...