Як ігнорувати розширення в сценарії SQL, що працює від SQL Plus?


104

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

Відповіді:


181

Це може допомогти вам:

set define off

Інакше амперсанд повинен бути в кінці рядка,

'StackOverflow &' || ' you'

EDIT: Я був щасливий за натискання під час збереження ... Про це посилалось у блозі .


2
Ви також можете вказати це у файлі налаштування профілю glogin.sql або у файлі налаштування профілю користувача login.sql
Девід Олдрідж,

Це найпростіше рішення, якщо ви не зацікавлені в змінних змін.
Драмбег

Завжди рішення, що рятує життя :) Дякую.
Аняна Сільва

25

Якщо ви іноді використовуєте змінні заміни, можливо, ви не хочете вимикати визначення. У цих випадках ви можете перетворити амперсанд з його числового еквівалента як у || Chr(38) ||або додати його як єдиний символ як у || '&' ||.


Конкретний сценарій - це пакет, джерело якого включає в себе коментар і текст у коментарі. Я не бачу, як я би використовував конкатенацію або заміну для цього.
JoshL

JoshL, ти прав, я просто перерахував це для повноти. Він пов'язаний з вашим запитанням, хоча він не відповідає безпосередньо на ваше конкретне питання.
Лей Ріффель

Це фактично мені допомогло.
Архімед Траяно

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 пакетів.
Драмбег

3

set define off <- Це найкраще рішення, яке я знайшов

Я також спробував ...

встановити set}

Мені вдалося вставити декілька записів, що містять символи "&", але я не можу використовувати символ "}" у тексті, тому я вирішив використовувати "set define off" і все працює як слід.


2

Відповідно до цього приємного FAQ , є пара рішень.

Ви можете також уникнути амперсанда з символом зворотної косої риси, \якщо зможете змінити коментар.


2
Екскавація зворотної косої риси не працює в SQL * Plus або SQLDeveloper
Jim Tough

2
@JimTough Це робиться після його активаціїset escape on
Девід Балажич

0

У мене був випадок CASE, коли КОЛЕНО = "деякий текст і більше тексту", а потім ....

Я замінив його КОЛИЙ стовпець = 'деякий текст' || CHR (38) || 'Більше тексту' ТАКОЖ ...

ви також можете використати КОЛИ стовпець ПОДОБАЄТЕ 'деякий текст _ більше тексту', а потім ...

(_ - це підстановка для одного символу)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.