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.
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?
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 '#'
Si vous le faites à partir de SQLPLUS, utilisez
SET DEFINE OFF
pour l'empêcher de marcher et 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: INSERT INTO tableau VALEURS ( CONCAT ('J', CHR (38), 'J') )
SET SCAN OFF n'est plus disponible http://download-uk.Oracle.com/docs/cd/B10501_01/server.920/a90842/apc.htm
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 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.
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');
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')
Résultat de cette requête: Jonhy's Sport & Fitness
Si vous utilisez SQL plus, alors je pense que vous devez lancer la commande
SET SCAN OFF
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)
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 .
Regarde, Andrew:
"J & J Construction" :
SELECT CONCAT ('J', CONCAT (CHR (38), 'J Construction')) FROM DUAL;