Jak zignorować znaki handlowe w skrypcie SQL uruchomionym z programu SQL Plus?

105

Mam skrypt SQL, który tworzy pakiet z komentarzem zawierającym znak ampersand (&). Kiedy uruchamiam skrypt z SQL Plus, pojawia się monit o wprowadzenie wartości zastępczej dla ciągu zaczynającego się od &. Jak wyłączyć tę funkcję, aby SQL Plus ignorował znak ampersand?

JoshL
źródło

Odpowiedzi:

182

To może Ci pomóc:

set define off

W przeciwnym razie znak ampersand musi znajdować się na końcu ciągu,

'StackOverflow &' || ' you'

EDYCJA: byłem zadowolony z kliknięcia podczas zapisywania ... Odwołano się do tego z bloga .

Austin Salonen
źródło
2
Możesz również określić to w pliku konfiguracyjnym profilu witryny glogin.sql lub pliku konfiguracyjnym profilu użytkownika login.sql
David Aldridge
To najprostsze rozwiązanie, jeśli nie interesują Cię zmienne podstawiane.
Drumbeg
Zawsze ratujące życie rozwiązanie :) Dzięki.
Anjana Silva,
25

Jeśli czasami używasz zmiennych zastępujących, możesz nie chcieć wyłączać definicji. W takich przypadkach można przekonwertować ampersand z jego numerycznego odpowiednika, jak w, || Chr(38) ||lub dołączyć go jako pojedynczy znak, jak w || '&' ||.

Leigh Riffel
źródło
Konkretny scenariusz to pakiet, którego źródło zawiera znak ampersand w komentarzu. Nie wiem, jak użyłbym do tego łączenia lub podstawiania.
JoshL
JoshL, masz rację, wymieniłem to tylko dla kompletności. Jest powiązany z Twoim pytaniem, mimo że nie odpowiada bezpośrednio na Twoje pytanie.
Leigh Riffel,
Właściwie to mi pomogło.
Archimedes Trajano,
13

Rozwiązałem za pomocą poniższego kodu:

set escape on

i umieść \ obok & po lewej stronie 'value_\&_intert'

Att

Cauca
źródło
To zadziałało dla mnie. Używałem polecenia, comment on column tablename.columnname is 'war ' || chr(38) || ' peace'ale dawało mi ono błąd ORA-01780: string literal required.
mrswadge
6

Możesz ustawić znak specjalny, który jest poszukiwany po wykonaniu skryptu, na inną wartość za pomocą SET DEFINE <1_CHARACTER>

Domyślnie sama funkcja DEFINE jest włączona i ustawiona na &

Można go wyłączyć - jak już wspomniano - ale można też tego uniknąć, ustawiając go na inną wartość. Bądź bardzo świadomy tego, na jaki znak go ustawiłeś. W poniższym przykładzie wybrałem znak #, ale ten wybór jest tylko przykładem.

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
źródło
1
Sam ostatnio używałem tego podejścia. Podoba mi się to, ponieważ nie wymaga ode mnie zmiany zawartości moich pakietów PL / SQL.
Drumbeg
3

set define off <- To najlepsze rozwiązanie, jakie znalazłem

Próbowałem też ...

set define}

Udało mi się wstawić kilka rekordów zawierających ampersand znaki „&”, ale nie mogę użyć znaku „}” w tekście, więc zdecydowałem się użyć „set define off” i wszystko działa tak, jak powinno.

ora
źródło
2

Zgodnie z tym fajnym FAQ istnieje kilka rozwiązań.

Możesz również wstawić znak „ampersand” za pomocą znaku ukośnika odwrotnego, \jeśli możesz zmodyfikować komentarz.

user19387
źródło
2
Ucieczka z ukośnikiem odwrotnym nie działa w SQL * Plus lub SQLDeveloper
Jim Tough
2
@JimTough Robi to po aktywacjiset escape on
David Balažic
0

Miałem instrukcję CASE z kolumną WHEN = „coś tekstu i więcej tekstu” WTEDY ....

Zastąpiłem go kolumną KIEDY = 'coś_tekst' || CHR (38) || „więcej tekstu” WTEDY ...

możesz również użyć GDY kolumna LIKE 'someext _ more text' THEN ...

(_ to symbol wieloznaczny dla pojedynczego znaku)

AWOLKiwi
źródło