J'essaie d'interroger une certaine ligne par nom dans ma base de données SQL et il a une esperluette. J'ai essayé de définir un caractère d'échappement, puis d'échapper à l'esperluette, mais pour une raison quelconque, cela ne fonctionne pas et je ne sais pas quel est exactement mon problème.
Set escape '\'
select * from V1144engine.T_nodes where node_id in(
select node2_id from V1144engine.T_edges where node1_id in(
select node2_id from V1144engine.T_edges where node1_id in(
select node2_id from V1144engine.T_edges where node1_id =
(select node_id from V1144engine.T_nodes where node_name = 'Geometric Vectors \& Matrices')))
and Edge_type_id = 1)
and node_type_id = 1
and node_id in (
select node2_id from V1144engine.T_edges where node1_id =
(select node_id from V1144engine.T_nodes where node_name = 'Algebra II')
and Edge_type_id = 2);
Bien que cela apporte une solution similaire à cette question , les problèmes se posent très différemment. Ils peuvent finir par avoir la même solution, mais cela ne signifie pas que les questions sont les mêmes.
Au lieu de
node_name = 'Geometric Vectors \& Matrices'
utilisation
node_name = 'Geometric Vectors ' || chr(38) || ' Matrices'
38 est le code ascii pour esperluette, et sous cette forme, il sera interprété comme une chaîne, rien d'autre. Je l'ai essayé et cela a fonctionné.
Une autre façon pourrait être d'utiliser LIKE et de souligner le caractère '&' à la place:
node_name LIKE 'Geometric Vectors _ Matrices'
La chance que vous trouviez un autre disque aussi, qui est différent dans ce seul caractère, est assez faible.
Escape est défini sur \
par défaut , vous n'avez donc pas besoin de le définir; mais si vous le faites, ne le mettez pas entre guillemets.
Esperluette est le marqueur SQL * Plus variable de substitution ; mais vous pouvez le changer , ou plus utilement dans votre cas, l'éteindre complètement avec:
set define off
Dans ce cas, vous n'avez pas besoin de vous soucier d'échapper à la valeur.
Vous pouvez utiliser
set define off
En utilisant cela, il ne sera pas demandé pour l'entrée
directement à partir du livre Oracle sql Fundamentals
SET DEFINE OFF
select 'Coda & Sid' from dual;
SET DEFINE ON
comment pourrait-on y échapper sans définir.
Pour échapper à &
, vous pouvez essayer les méthodes suivantes: -
set scan off
set define off
set escape on
puis remplacez &
par /&
&
par &&
L'un d'entre eux devrait travailler au moins.
ASi vous utilisez un développeur PL/SQL, il y a alors & icône en bas de la fenêtre SQL, veuillez y aller et désactiver il. Notez que dans l’ancienne version, cette option n’est pas présente.
Assurez-vous également que set define est écrit au tout début du script.
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...
ou bien:
set define off
... node_name = 'Geometric Vectors & Matrices' ...
La première vous permet d’utiliser la barre oblique inverse pour échapper au &.
La seconde est désactivée et "globalement" (inutile d'ajouter une barre oblique inverse n'importe où). Vous pouvez le réactiver avec set define on
et cette ligne des esperluettes retrouvera leur signification particulière. Vous pourrez donc le désactiver pour certaines parties du script et pas pour d'autres.
Cela fonctionne aussi bien:
select * from mde_product where cfn = 'A3D"&"R01'
vous définissez &
comme littéral en incluant est avec double qoutes "&"
dans la chaîne.
REPLACE(<your xml column>,'&',chr(38)||'amp;')