Вопрос

Как я могу написать оператор 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top