2008-09-30 4 views

ответ

53

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

Во-первых, & является префиксом переменной в 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 

Если вы хотите использовать другой экранирующий символ:

set define on 
set escape '#' 

define myvar=/forth 

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

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

set escape off 
set escape '#' 
+0

np! как я уже сказал, я продолжаю забывать об этом, так счастлив за возможность записать «всеобъемлющий ответ» ;-) – tardate 2009-01-20 08:06:45

+0

Это [SQL * Plus FAQ] (http://www.orafaq.com/wiki/SQL*Plus_FAQ# How_does_one_disable_interactive_prompting_in_SQL.2APlus.3F) дает аналогичный ответ. – DavidRR 2012-11-16 14:15:22

0

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

SET SCAN OFF 
16

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

SET DEFINE OFF 

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

+3

Работает в SQL Developer также – 2008-09-30 15:47:43

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

(Некомпьютерный, не имеет ящика Oracle под рукой, и он имеет был в то время)

+1

Тогда вы должны были бы иметь специальную обработку для задания обратной косой черты. – 2008-09-30 15:47:03

2

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

SET DEF OFF

или

SET SCAN OFF

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

4

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

5

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

set def off; 
insert into tablename values('J&J'); 
0

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

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

+0

Что делать, если вам нужно работать с коробкой Unix/Linux !!! :) – Neels 2014-10-09 14:50:18

5

Там всегда функция CHR(), которая преобразует код ASCII в строку.

ie. что-то вроде: INSERT INTO таблицу ЗНАЧЕНИЯ ( Concat ('J', CHR (38), 'J') )

7

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

select 'J' || chr(38) || 'J Construction' from dual; 
2

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

insert into table_name (col_name) values('J'||'&'||'Construction'); 
0

Посмотрите, Эндрю:

"J & J Строительство":

ВЫБРАТЬ CONCAT ('J', CONCAT (CHR (38), 'J Строительство')) FROM DUAL ;

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

выход Этот запрос по: Jonhy в Спорт & Фитнес