Как игнорировать амперсанды в сценарии SQL, запущенном из SQL Plus?

105

У меня есть сценарий SQL, который создает пакет с комментарием, содержащим амперсанд (&). Когда я запускаю сценарий из SQL Plus, мне предлагается ввести замещающее значение для строки, начинающейся с &. Как отключить эту функцию, чтобы SQL Plus игнорировал амперсанд?

JoshL
источник

Ответы:

182

Это может сработать для вас:

set define off

В противном случае амперсанд должен быть в конце строки,

'StackOverflow &' || ' you'

РЕДАКТИРОВАТЬ: Я был счастлив при сохранении ... На это ссылались в блоге .

Остин Салонен
источник
2
Вы также можете указать это в файле настройки профиля сайта glogin.sql или в файле настройки профиля пользователя login.sql
Дэвид Олдридж,
Это простейшее решение, если вас не интересуют подстановочные переменные.
Drumbeg 01
Всегда спасательное решение :) Спасибо.
Анджана Сильва
25

Если вы иногда используете подстановочные переменные, возможно, вы не захотите отключать определение. В этих случаях вы можете преобразовать амперсанд из его числового эквивалента, как в, || Chr(38) ||или добавить его как один символ, как в || '&' ||.

Ли Риффель
источник
Конкретный сценарий - это пакет, источник которого включает в себя амперсанд в комментарии. Я не понимаю, как бы я использовал для этого конкатенацию или замену.
JoshL
JoshL, вы правы, я просто перечислил это для полноты. Это связано с вашим вопросом, даже если оно не дает прямого ответа на ваш конкретный вопрос.
Ли Риффель,
Это действительно помогло мне.
Archimedes Trajano
13

Я решил с помощью кода ниже:

set escape on

и поставьте \ рядом с & слева 'value_\&_intert'

Att

Каука
источник
Это сработало для меня. Я использовал команду, comment on column tablename.columnname is 'war ' || chr(38) || ' peace'но она выдавала ошибку ORA-01780: string literal required.
mrswadge
6

Вы можете установить для специального символа, который требуется при выполнении сценария, другое значение, используя SET DEFINE <1_CHARACTER>

По умолчанию сама функция DEFINE включена, и для нее установлено значение &

Его можно отключить, как уже упоминалось, но его также можно избежать, установив другое значение. Внимательно относитесь к тому знаку, на который вы его поставили. В приведенном ниже примере я выбрал символ #, но этот выбор является лишь примером.

SQL> select '&var_ampersand #var_hash' from dual;
Enter value for var_ampersand: a value

'AVALUE#VAR_HASH'
-----------------
a value #var_hash

SQL> set define #
SQL> r
  1* select '&var_ampersand #var_hash' from dual
Enter value for var_hash: another value

'&VAR_AMPERSANDANOTHERVALUE'
----------------------------
&var_ampersand another value

SQL>
tvCa
источник
1
Я сам недавно использовал этот подход. Мне это нравится, поскольку мне не нужно изменять содержимое моих пакетов PL / SQL.
Drumbeg 01
3

set define off <- это лучшее решение, которое я нашел

Я тоже пробовал ...

установить определение}

Мне удалось вставить несколько записей, содержащих символы амперсанда «&», но я не могу использовать в тексте символ «}». Поэтому я решил использовать «set define off», и все работает как надо.

ора
источник
2

Согласно этому красивому FAQ есть несколько решений.

Вы также можете экранировать амперсанд с помощью символа обратной косой черты, \если можете изменить комментарий.

user19387
источник
2
Экранирование обратной косой черты не работает в SQL * Plus или SQLDeveloper
Джим
2
@JimTough Это происходит после его активации с помощьюset escape on
Дэвид Балажич
0

У меня был оператор CASE с WHEN column = 'sometext & more text' THEN ....

Я заменил его на WHEN column = 'sometext' || CHR (38) || 'больше текста' ТОГДА ...

вы также можете использовать КОГДА столбец LIKE 'sometext _ more text' THEN ...

(_ - это подстановочный знак для одного символа)

AWOLKiwi
источник