“&”を含む文字列を挿入する方法
質問
&を含むinsertステートメントを記述する方法キャラクター?たとえば、「J& J Construction」を挿入する場合、データベースの列に挿入します。
違いが生じるかどうかはわかりませんが、Oracle 9iを使用しています。
解決
これを忘れて、また戻ってきます!最善の答えは、これまでに提供された回答の組み合わせだと思います。
まず、&はsqlplus / sqldeveloperの変数プレフィックスであるため、問題-表示された場合、変数名の一部であることが予想されます。
SET DEFINE OFFは、sqlplusの解釈を停止します&このように。
しかし、sqlplus変数と リテラル&を使用する必要がある場合はどうなりますか?キャラクター?
- 変数を機能させるにはSET DEFINE ONが必要です
- &の使用をエスケープするには、ESCAPE ONを設定します。
e.g。
set define on
set escape on
define myvar=/forth
select 'back\\ \& &myvar' as swing from dual;
プロデュース:
old 1: select 'back\\ \& &myvar' from dual
new 1: select 'back\ & /forth' from dual
SWING
--------------
back\ & /forth
別のエスケープ文字を使用する場合:
set define on
set escape '#'
define myvar=/forth
select 'back\ #& &myvar' as swing from dual;
特定のエスケープ文字を設定すると、「SP2-0272:エスケープ文字を英数字または空白にすることはできません」と表示される場合があります。これはおそらく、エスケープ文字がすでに定義されていることを意味し、物事は恐ろしく自己参照的になります。この問題を回避するクリーンな方法は、最初にエスケープをオフにすることです:
set escape off
set escape '#'
他のヒント
SQLPLUSから使用する場合
SET DEFINE OFF
トレッドを停止するには&特別な場合として
代替ソリューション、連結とchr関数を使用:
select 'J' || chr(38) || 'J Construction' from dual;
正しい構文は
ですset def off;
insert into tablename values( 'J&J');
常にASCIIコードを文字列に変換するchr()関数があります。
ie。何かのようなもの: INSERT INTO 表 VALUES( CONCAT( 'J'、CHR(38)、 'J') )
プログラムでは、常にパラメーター化されたクエリを使用します。 SQLインジェクション攻撃や、SQLパーサーに特有のその他の文字を回避します。
次のオプションのいずれかを使用すると動作することがわかりました:
SET DEF OFF
または
スキャンをオフに設定
データベースの方が良いか、「もっと正しい」かを知るのに十分なデータベースがありません。他より。また、これらのいずれかよりも優れたものがある場合は、お知らせください。
'J' || '&' || 'Construction' などの文字列を挿入できます。 正常に動作します。
insert into table_name (col_name) values('J'||'&'||'Construction');
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')
このクエリの出力: Jonhy's Sport&フィットネス
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;
(テストされていない、手元にOracleボックスがなく、しばらくの間)
sql plusを使用している場合、コマンドを発行する必要があると思います
SET SCAN OFF
SQL / Plusの使用をやめ、 PL / SQL Developer をお勧めします。 SQLツール。
p.s。一部の人々は、 TOAD を好みます。
見て、アンドリュー:
" J& J Construction" :
SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;