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.
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 '#'
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
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;
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');
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" ) )
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
SET SCAN OFF jest przestarzałe http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a90842/apc.htm
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.
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ć.
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');
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)
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
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
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ę .
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;
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