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

91

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

Теги:
sqlplus

7 ответов

158
Лучший ответ

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

set define off

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

'StackOverflow &' || ' you'

EDIT: я был счастлив при нажатии на сохранение... Это было указано в blog.

  • 2
    Вы также можете указать это в файле настройки профиля сайта glogin.sql или в файле настройки профиля пользователя login.sql
  • 0
    Это самое простое решение, если вас не интересуют переменные подстановки.
Показать ещё 1 комментарий
23

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

  • 0
    Конкретный сценарий представляет собой пакет, источник которого включает в себя амперсанд в комментарии. Я не понимаю, как бы я использовал конкатенацию или замену для этого.
  • 0
    JoshL, вы правы, я просто перечислил это для полноты. Это связано с вашим вопросом, хотя и не дает прямого ответа на ваш конкретный вопрос.
Показать ещё 1 комментарий
9

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

set escape on

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

Атр

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

Вы можете установить специальный символ, который ищет при выполнении script, другому значению с помощью 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>
  • 0
    Я сам недавно использовал этот подход. Мне нравится это, поскольку это не требует, чтобы я изменил содержание своих пакетов PL / SQL.
3

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

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

set define}

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

2

В соответствии с этот хороший FAQ есть несколько решений.

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

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

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

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

вы могли бы также использовать колонку WHEN LIKE 'sometext _ more text' THEN...

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню