Как я могу написать оператор вставки, который включает символ &? Например, если я хочу вставить «J&J Construction» в столбец базы данных.
Я не уверен, что это имеет значение, но я использую Oracle 9i.
Как я могу написать оператор вставки, который включает символ &? Например, если я хочу вставить «J&J Construction» в столбец базы данных.
Я не уверен, что это имеет значение, но я использую Oracle 9i.
Я постоянно забываю об этом и возвращаюсь к этому снова! Я думаю, что лучший ответ - это комбинация ответов, предоставленных до сих пор.
Во-первых, & - это префикс переменной в sqlplus/sqldeveloper, отсюда и проблема - когда он появляется, ожидается, что он будет частью имени переменной.
SET DEFINE OFF остановит интерпретацию sqlplus и таким образом.
Но что, если вам нужно использовать переменные sqlplus и литералы и символы?
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 '#'
Если вы делаете это из SQLPLUS, используйте
SET DEFINE OFF
чтобы остановить его наступание и как особый случай
Альтернативное решение, используйте конкатенацию и функцию chr:
select 'J' || chr(38) || 'J Construction' from dual;
Правильный синтаксис
set def off;
insert into tablename values( 'J&J');
Всегда есть функция chr(), которая преобразует код ascii в строку.
т.е. что-то вроде: INSERT INTO table VALUES (CONCAT('J', CHR(38), 'J'))
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')
Результат этого запроса: Спорт и фитнес Johnhy's.
SET SCAN OFF устарела http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a90842/apc.htm
В программе всегда используйте параметризованный запрос. Это позволяет избежать атак SQL Injection, а также любых других символов, которые являются специальными для синтаксического анализатора SQL.
Вы можете вставить такую строку как 'J'||'&'||'Construction'. Это работает нормально.
insert into table_name (col_name) values('J'||'&'||'Construction');
Я обнаружил, что использование любого из следующих вариантов работает:
SET DEF OFF
or
SET SCAN OFF
Я недостаточно разбираюсь в базах данных, чтобы понять, лучше ли одна или «более правильная», чем другая. Кроме того, если есть что-то лучше, чем любой из них, пожалуйста, дайте мне знать.
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;
(Не проверено, под рукой нет коробки Oracle, и это было давно)
Если вы используете sql plus, я думаю, вам нужно ввести команду
SET SCAN OFF
Прекратите использовать SQL/Plus, я настоятельно рекомендую PL/SQL Developer, это гораздо больше, чем инструмент SQL. .
p.s. Некоторые люди предпочитают TOAD.
Смотри, Андрей:
"Джей энд Джей Констракшн":
SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;