Question

Comment puis-je écrire une instruction insert qui inclut le & amp; personnage? Par exemple, si je voulais insérer "J & amp; J Construction" dans une colonne de la base de données.

Je ne sais pas si cela fait une différence, mais j'utilise Oracle 9i.

Était-ce utile?

La solution

Je continue d’oublier cela et de revenir à ce sujet! Je pense que la meilleure réponse est une combinaison des réponses fournies jusqu'à présent.

Tout d'abord, & amp; est le préfixe de la variable dans sqlplus / sqldeveloper, d’où le problème - lorsqu’il apparaît, il devrait faire partie d’un nom de variable.

SET DEFINE OFF arrête l’interprétation de sqlplus & amp; de cette façon.

Mais que se passe-t-il si vous devez utiliser les variables sqlplus et literal & amp; personnages?

  • Vous devez avoir SET DEFINE ON pour que les variables fonctionnent
  • Et SET ESCAPE ON pour échapper aux utilisations de & amp;.

par exemple

set define on
set escape on

define myvar=/forth

select 'back\\ \& &myvar' as swing from dual;

Produit:

old   1: select 'back\\ \& &myvar' from dual
new   1: select 'back\ & /forth' from dual

SWING
--------------
back\ & /forth

Si vous souhaitez utiliser un autre caractère d'échappement:

set define on
set escape '#'

define myvar=/forth

select 'back\ #& &myvar' as swing from dual;

Lorsque vous définissez un caractère d'échappement spécifique, vous pouvez voir «SP2-0272: le caractère d'échappement ne peut être ni alphanumérique ni un espace». Cela signifie probablement que vous avez déjà défini le caractère d'échappement et que les choses deviennent terriblement auto-référentielles. La façon propre d’éviter ce problème est de commencer par définir l’échappement:

set escape off
set escape '#'

Autres conseils

Si vous le faites à partir de SQLPLUS, utilisez

SET DEFINE OFF  

pour l'empêcher de marcher & amp; comme cas particulier

Une solution alternative, utilisez la concaténation et la fonction chr:

select 'J' || chr(38) || 'J Construction' from dual;

La syntaxe correcte est

set def off;
insert into tablename values( 'J&J');

Il y a toujours la fonction chr () qui convertit un code ascii en chaîne.

c'est à dire. quelque chose comme: INSÉRER DANS  table VALEURS (  CONCAT ('J', CHR (38), 'J') )

Dans un programme, utilisez toujours une requête paramétrée. Cela évite les attaques par injection SQL ainsi que tout autre caractère spécial pour l’analyseur SQL.

J'ai constaté que l'utilisation de l'une des options suivantes fonctionne:

SET DEF OFF

ou

SET SCAN OFF

Je ne connais pas suffisamment les bases de données pour savoir si l’on est meilleur ou "plus juste". que l'autre. De plus, s'il y a quelque chose de mieux que l'un ou l'autre, faites-le-moi savoir.

Vous pouvez insérer une chaîne telle que 'J' || '&' || 'Construction' . Cela fonctionne bien.

insert into table_name (col_name) values('J'||'&'||'Construction');
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')

Résultat de cette requête: Jonhy Sport & amp; Fitness

SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;

(Non testé, vous n'avez pas de boîte Oracle à portée de main et cela fait longtemps)

Si vous utilisez SQL plus, alors je pense que vous devez lancer la commande

SET SCAN OFF

Arrêtez d'utiliser SQL / Plus, je vous recommande vivement de développeur PL / SQL , c'est bien plus que un outil SQL.

p.s. Certaines personnes préfèrent TOAD .

Regardez, Andrew:

"J & amp; J Construction" :

SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top