it-swarm.com.de

Wie füge ich einen String ein, der ein "&" enthält

Wie schreibe ich eine Einfügeanweisung, die das Zeichen & enthält? Zum Beispiel, wenn ich "J & J Construction" in eine Spalte in der Datenbank einfügen wollte.

Ich bin nicht sicher, ob es einen Unterschied macht, aber ich verwende Oracle 9i.

35
Andrew Hampton

Ich vergesse das immer wieder und komme wieder darauf zurück! Ich denke, die beste Antwort ist eine Kombination der bisherigen Antworten.

Erstens ist & das Variablenpräfix in sqlplus/sqldeveloper, daher das Problem: Wenn es erscheint, wird erwartet, dass es Teil eines Variablennamens ist.

SET DEFINE OFF stoppt die SQL-Interpretation & auf diese Weise.

Was aber, wenn Sie die sqlplus-Variablen und literal & character verwenden müssen? 

  • Sie benötigen SET DEFINE ON, damit Variablen funktionieren
  • Und SET ESCAPE ON, um die Verwendung von & zu verhindern.

z.B.

set define on
set escape on

define myvar=/forth

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

Produziert:

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

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

Wenn Sie ein anderes Escape-Zeichen verwenden möchten:

set define on
set escape '#'

define myvar=/forth

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

Wenn Sie ein bestimmtes Escape-Zeichen festlegen, wird möglicherweise 'SP2-0272: Escape-Zeichen darf nicht alphanumerisch oder Leerzeichen sein' angezeigt. Dies bedeutet wahrscheinlich, dass Sie bereits den Fluchtcharakter definiert haben und die Dinge schrecklich auf sich selbst bezogen werden. Der saubere Weg, dieses Problem zu vermeiden, besteht darin, zuerst zu entkommen:

set escape off
set escape '#'
55
tardate

Wenn du es aus SQLPLUS machst, benutze 

SET DEFINE OFF  

um das Treten zu stoppen & als Sonderfall

16
hamishmcn

Als alternative Lösung verwenden Sie die Verkettung und die chr-Funktion:

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

Die korrekte Syntax lautet

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

Es gibt immer die Funktion chr (), die einen ASCII-Code in einen String konvertiert.

dh. etwas wie: INSERT INTO Tabelle WERTE ( CONCAT ('J', CHR (38), 'J') )

5
Hans
4
hamishmcn

Verwenden Sie in einem Programm immer eine parametrisierte Abfrage. Es vermeidet SQL-Injection-Angriffe sowie andere Zeichen, die für den SQL-Parser speziell sind.

4
Mike Dimmick

Ich habe festgestellt, dass eine der folgenden Optionen funktioniert:

SET DEF OFF 

oder

SET SCAN OFF

Ich weiß nicht genug über Datenbanken, um zu wissen, ob eine besser oder "richtiger" ist als die andere. Wenn es etwas Besseres gibt, lass es mich wissen.

2
Andrew Hampton

Sie können eine solche Zeichenfolge als 'J' || '&' || 'Construction' ..__ einfügen. Das funktioniert gut.

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

Ausgabe dieser Abfrage: Jonhy's Sport & Fitness  

1
aemre

Wenn Sie SQL Plus verwenden, denke ich, dass Sie den Befehl ausgeben müssen 

SET SCAN OFF
0
stjohnroe
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;

(Ungetestet, keine Oracle-Box zur Hand und schon eine Weile)

0
Roel

Stoppen Sie die Verwendung von SQL/Plus. Ich empfehle dringend, PL/SQL Developer es ist viel mehr als ein SQL-Tool.

p.s. Manche Leute bevorzugen KRÖTE .

0

Schau mal, Andrew:

"J & J Construction" :

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

0