Как вставить строку, содержащую "&”
Вопрос
Как я могу написать оператор insert, который включает символ &?Например, если бы я хотел вставить "J & J Construction" в столбец в базе данных.
Я не уверен, имеет ли это значение, но я использую Oracle 9i.
Решение
Я все время забываю об этом и возвращаюсь к этому снова!Я думаю, что лучший ответ - это комбинация ответов, предоставленных на данный момент.
Во-первых, & является префиксом переменной в sqlplus / sqldeveloper, отсюда и проблема - когда он появляется, ожидается, что он будет частью имени переменной.
УСТАНОВИТЕ значение DEFINE OFF, чтобы остановить интерпретацию sqlplus & таким образом.
Но что, если вам нужно использовать переменные sqlplus и литерал и символы?
- Вам нужно установить DEFINE ВКЛ, чтобы переменные работали
- И УСТАНОВИТЕ ESCAPE ВКЛ., чтобы избежать использования & .
например ,
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
Если вы хотите использовать другой экранирующий символ:
set define on
set escape '#'
define myvar=/forth
select 'back\ #& &myvar' as swing from dual;
Когда вы устанавливаете определенный escape-символ, вы можете увидеть 'SP2-0272:управляющий символ не может быть буквенно-цифровым или пробелом".Вероятно, это означает, что у вас уже определен 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-код в строку.
т.е.что -то вроде:ВСТАВИТЬ В таблицу ЗНАЧЕНИЯ ( CONCAT('J', CHR(38), 'J' ) )
ОТКЛЮЧИТЬ СКАНИРОВАНИЕ устарело http://download-uk .oracle.com/docs/cd/B10501_01/server.920/a90842/apc.htm
В программе всегда используйте параметризованный запрос.Это позволяет избежать атак SQL-инъекций, а также любых других символов, которые являются специальными для анализатора SQL.
Я обнаружил, что использование любого из следующих вариантов работает:
SET DEF OFF
или
SET SCAN OFF
Я недостаточно разбираюсь в базах данных, чтобы понять, является ли одна из них лучше или "более правильной", чем другая.Кроме того, если есть что-то лучше любого из этих вариантов, пожалуйста, дайте мне знать.
Вы можете вставить такую строку, как 'J'||'&'||'Конструкция'.Это работает нормально.
insert into table_name (col_name) values('J'||'&'||'Construction');
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')
Результат этого запроса : Jonhy's Спорт и фитнес
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;
(Непроверенный, у вас нет под рукой Oracle box, и прошло какое-то время)
Если вы используете sql plus, то я думаю, что вам нужно выполнить команду
SET SCAN OFF
Прекратите использовать SQL / Plus, я настоятельно рекомендую Разработчик PL / SQL это гораздо больше, чем инструмент SQL.
p.s.Некоторые люди предпочитают ЖАБА.
Послушай, Эндрю:
"Джей эндДжей Констракшн":
SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;