Comment ignorer les esperluettes dans un script SQL exécuté à partir de SQL Plus?

104

J'ai un script SQL qui crée un package avec un commentaire contenant une esperluette (&). Lorsque j'exécute le script à partir de SQL Plus, je suis invité à entrer une valeur de remplacement pour la chaîne commençant par &. Comment désactiver cette fonctionnalité afin que SQL Plus ignore l'esperluette?

JoshL
la source

Réponses:

181

Cela peut fonctionner pour vous:

set define off

Sinon, l'esperluette doit être à la fin d'une chaîne,

'StackOverflow &' || ' you'

EDIT: J'étais content du clic lors de l'enregistrement ... Cela a été référencé à partir d'un blog .

Austin Salonen
la source
2
Vous pouvez également le spécifier dans le fichier de configuration du profil de site glogin.sql ou dans le fichier de configuration du profil utilisateur login.sql
David Aldridge
C'est la solution la plus simple si vous n'êtes pas intéressé par les variables de substitution.
Drumbeg
Toujours une solution de sauvetage :) Merci.
Anjana Silva
25

Si vous utilisez parfois des variables de substitution, vous ne voudrez peut-être pas désactiver la définition. Dans ces cas, vous pouvez convertir l'esperluette à partir de son équivalent numérique comme dans || Chr(38) ||ou l'ajouter en tant que caractère unique comme dans || '&' ||.

Leigh Riffel
la source
Le scénario spécifique est un package dont la source inclut une esperluette dans un commentaire. Je ne vois pas comment j'utiliserais la concaténation ou la substitution pour cela.
JoshL
JoshL, vous avez raison, je viens d'énumérer ceci par souci d'exhaustivité. Elle est liée à votre question même si elle ne répond pas directement à votre question spécifique.
Leigh Riffel
Cela m'a vraiment aidé.
Archimedes Trajano
13

J'ai résolu avec le code ci-dessous:

set escape on

et mettre un \ à côté de & à gauche 'value_\&_intert'

Att

Cauca
la source
Cela a fonctionné pour moi. J'utilisais la commande comment on column tablename.columnname is 'war ' || chr(38) || ' peace'mais cela me donnait l'erreur ORA-01780: string literal required.
mrswadge
6

Vous pouvez définir le caractère spécial, recherché lors de l'exécution d'un script, sur une autre valeur en utilisant le SET DEFINE <1_CHARACTER>

Par défaut, la fonction DEFINE elle-même est activée et définie sur &

Il peut être désactivé - comme déjà mentionné - mais il peut également être évité en le réglant sur une valeur différente. Soyez très conscient du signe que vous définissez. Dans l'exemple ci-dessous, j'ai choisi le caractère #, mais ce choix n'est qu'un exemple.

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
la source
1
J'ai moi-même utilisé cette approche récemment. Je l'aime car il ne m'oblige pas à modifier le contenu de mes packages PL / SQL.
Drumbeg
3

set define off <- C'est la meilleure solution que j'ai trouvée

J'ai aussi essayé ...

définir définir}

J'ai pu insérer plusieurs enregistrements contenant des caractères esperluette '&' mais je ne peux pas utiliser le caractère '}' dans le texte. J'ai donc décidé d'utiliser "set define off" et tout fonctionne comme il se doit.

ora
la source
2

Selon cette belle FAQ, il existe plusieurs solutions.

Vous pourrez peut-être également échapper l'esperluette avec la barre oblique inverse \si vous pouvez modifier le commentaire.

user19387
la source
2
L'échappement de la barre oblique inverse ne fonctionne pas dans SQL * Plus ou SQLDeveloper
Jim Tough
2
@JimTough It le fait après l'avoir activé avecset escape on
David Balažic
0

J'ai eu une instruction CASE avec WHEN column = 'someext & more text' THEN ....

Je l'ai remplacé par WHEN column = 'someext' || CHR (38) || 'plus de texte' ALORS ...

vous pouvez également utiliser WHEN colonne LIKE 'someext _ more text' THEN ...

(_ est le caractère générique d'un seul caractère)

AWOLKiwi
la source