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


105

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

Ответы:


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>

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

3

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

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

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

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


2

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

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


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 ...

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.