web-dev-qa-db-fra.com

Comment insérer une chaîne contenant un "&"

Comment puis-je écrire une instruction insert qui inclut le caractère &? Par exemple, si je voulais insérer "J & 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.

35
Andrew Hampton

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

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

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

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

  • Vous avez besoin de SET DEFINE ON pour que les variables fonctionnent
  • Et SET ESCAPE ON pour échapper aux utilisations de &.

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 caractère d'échappement différent:

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 pas être alphanumérique ni d'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 manière propre d’éviter ce problème est de commencer par échapper:

set escape off
set escape '#'
55
tardate

Si vous le faites à partir de SQLPLUS, utilisez 

SET DEFINE OFF  

pour l'empêcher de marcher et comme cas particulier

16
hamishmcn

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

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

La syntaxe correcte est

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

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

c'est à dire. quelque chose comme: INSERT INTO tableau VALEURS ( CONCAT ('J', CHR (38), 'J') )

5
Hans
4
hamishmcn

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.

4
Mike Dimmick

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

SET DEF OFF 

ou

SET SCAN OFF

Je ne connais pas assez les bases de données pour savoir si l'une est meilleure 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.

2
Andrew Hampton

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

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

Résultat de cette requête: Jonhy's Sport & Fitness  

1
aemre

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

SET SCAN OFF
0
stjohnroe
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)

0
Roel

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

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

0
Osama Al-Maadeed

Regarde, Andrew:

"J & J Construction" :

SELECT CONCAT ('J', CONCAT (CHR (38), 'J Construction')) FROM DUAL;

0
Alberto Cerqueira