Как вставить строку, содержащую &

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

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


person Andrew Hampton    schedule 30.09.2008    source источник


Ответы (14)


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

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

SET DEFINE OFF остановит интерпретацию sqlplus и таким образом.

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

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

e.g.

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 '#'
person tardate    schedule 04.01.2009
comment
нп! как я уже сказал, я все время забываю об этом, так что рад возможности записать «всеобъемлющий ответ» ;-) - person tardate; 20.01.2009
comment
Этот Часто задаваемые вопросы по SQL*Plus содержит аналогичный ответ. - person DavidRR; 16.11.2012

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

SET DEFINE OFF  

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

person hamishmcn    schedule 30.09.2008

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

select 'J' || chr(38) || 'J Construction' from dual;
person C. J.    schedule 12.04.2013
comment
Вам не хватает || после ч(38) - person Eystein Bye; 11.11.2013

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

set def off;
insert into tablename values( 'J&J');
person Greg Ogle    schedule 30.09.2008

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

т.е. что-то вроде: INSERT INTO table VALUES (CONCAT('J', CHR(38), 'J'))

person Hans    schedule 04.01.2009

INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')

Результат этого запроса: Спорт и фитнес Johnhy's.

person aemre    schedule 22.01.2018

SET SCAN OFF устарела http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a90842/apc.htm

person hamishmcn    schedule 30.09.2008

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

person Mike Dimmick    schedule 30.09.2008

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

insert into table_name (col_name) values('J'||'&'||'Construction');
person lokesh kumar    schedule 06.04.2016

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

SET DEF OFF

or

SET SCAN OFF

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

person Andrew Hampton    schedule 30.09.2008

SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;

(Не проверено, под рукой нет коробки Oracle, и это было давно)

person Roel    schedule 30.09.2008
comment
Тогда у вас должна быть специальная обработка для указания обратной косой черты. - person David Aldridge; 30.09.2008

Если вы используете sql plus, я думаю, вам нужно ввести команду

SET SCAN OFF
person stjohnroe    schedule 30.09.2008

Прекратите использовать SQL/Plus, я настоятельно рекомендую PL/SQL Developer, это гораздо больше, чем инструмент SQL. .

p.s. Некоторые люди предпочитают TOAD.

person Osama Al-Maadeed    schedule 06.10.2008

Смотри, Андрей:

"Джей энд Джей Констракшн":

SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;
person Alberto Cerqueira    schedule 30.08.2017