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?

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 .


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


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


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>

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.


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.


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)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.