Jak wstawić ciąg zawierający "&"

Jak mogę napisać instrukcję insert zawierającą & znak? Na przykład, jeśli chciałem wstawić "J & J Construction" do kolumny w bazie danych.

Nie jestem pewien, czy to robi różnicę, ale używam Oracle 9i.

Author: Mihai Limbășan, 2008-09-30

14 answers

Ciągle o tym zapominam i wracam do tego ponownie! Myślę, że najlepszą odpowiedzią jest połączenie dotychczas udzielonych odpowiedzi.

Po pierwsze, & jest prefiksem zmiennej w sqlplus/sqldeveloper, stąd problem - gdy się pojawi, oczekuje się, że będzie częścią nazwy zmiennej.

SET DEFINE OFF zatrzyma interpretację sqlplus w ten sposób.

Ale co jeśli potrzebujesz użyć zmiennych sqlplus i literalnych & znaków?

  • musisz ustawić DEFINE na aby zmienne działały
  • i ustaw ESCAPE na&.

Np.

set define on
set escape on

define myvar=/forth

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

Produkuje:

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

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

Jeśli chcesz użyć innego znaku ucieczki:

set define on
set escape '#'

define myvar=/forth

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

Kiedy ustawisz konkretny znak escape, możesz zobaczyć "SP2-0272: znak escape nie może być alfanumeryczny ani biały". Prawdopodobnie oznacza to, że masz już zdefiniowany znak ucieczki, a rzeczy stają się strasznie samo-referencjalne. Czystym sposobem uniknięcia tego problemu jest ustawienie escape off first:

set escape off
set escape '#'
 55
Author: tardate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-04 05:07:20

Jeśli robisz to z SQLPLUS użyj

SET DEFINE OFF  

To stop it treading & as a special case

 16
Author: hamishmcn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 12:37:30

Alternatywne rozwiązanie, użyj konkatenacji i funkcji chr:

select 'J' || chr(38) || 'J Construction' from dual;
 9
Author: C. J.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-26 23:41:52

Poprawna składnia to

set def off;
insert into tablename values( 'J&J');
 5
Author: Greg Ogle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 13:15:44

Zawsze jest funkcja chr (), która konwertuje kod ascii na łańcuch znaków.

Ie. coś jak: INSERT INTO tabela Wartości ( CONCAT ("J", CHR (38), "J" ) )

 5
Author: Hans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-04 07:32:39
 4
Author: hamishmcn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 12:40:30

W programie Zawsze używaj parametryzowanego zapytania. Unika ataków SQL Injection, jak również innych znaków, które są specjalne dla parsera SQL.

 4
Author: Mike Dimmick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 12:45:13

Odkryłem, że użycie jednej z poniższych opcji działa:

SET DEF OFF

Lub

SET SCAN OFF

Nie wiem wystarczająco dużo o bazach danych, aby wiedzieć, czy jedna jest lepsza lub "bardziej słuszna" od drugiej. Ponadto, jeśli jest coś lepszego niż którykolwiek z tych, proszę dać mi znać.

 2
Author: Andrew Hampton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 12:39:18

Możesz wstawić taki łańcuch jak 'J'||'&' / / 'Construction' . Działa dobrze.

insert into table_name (col_name) values('J'||'&'||'Construction');
 2
Author: lokesh kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-06 06:50:23
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;

(Nieprzetestowany, nie mam Skrzynki Oracle pod ręką i minęło trochę czasu)

 1
Author: Roel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 12:39:06
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')

Wynik tego zapytania: Jonhy ' S Sport & Fitness

 1
Author: aemre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 13:16:00

Jeśli używasz sql plus to myślę, że musisz wydać polecenie

SET SCAN OFF
 0
Author: stjohnroe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 12:42:38

Przestań używać SQL / Plus, Gorąco polecam PL/SQL Developer to znacznie więcej niż narzędzie SQL.

P. S. niektórzy wolą ropuchę .

 0
Author: Osama Al-Maadeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 19:54:59

# Patrz Andrzej:

"J & J Construction":

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

 0
Author: Alberto Cerqueira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 11:35:27