& 文字を含む挿入ステートメントを作成するにはどうすればよいですか? たとえば、データベースの列に「J&J Construction」を挿入したいとします。
違いがあるかどうかはわかりませんが、Oracle 9i を使用しています。
私はこれを忘れ続け、また戻ってきます!最良の答えは、これまでに提供された回答を組み合わせることだと思います。
まず、 & は sqlplus/sqldeveloper の変数プレフィックスであるため、問題が発生します。これが表示されると、変数名の一部であると予想されます。
SET DEFINE OFF は、このように sqlplus の解釈を停止します。
しかし、sqlplus 変数とリテラル & 文字を使用する必要がある場合はどうでしょうか?
例えば
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() 関数が常にあります。
すなわち。次のようなもの: INSERT INTO table VALUES ( CONCAT( 'J', CHR(38), 'J' ) )
プログラムでは、常にパラメーター化されたクエリを使用します。SQL インジェクション攻撃や、SQL パーサーにとって特別なその他の文字を回避します。
'J'||'&'||'Construction' のような文字列を挿入できます。それは正常に動作します。
insert into table_name (col_name) values('J'||'&'||'Construction');
次のオプションのいずれかを使用すると機能することがわかりました。
SET DEF OFF
また
SET SCAN OFF
データベースについて、一方が他方よりも優れているか、または「より適切」であるかを知るのに十分な知識はありません。また、どちらかより良いものがあれば教えてください。
sql plusを使用している場合は、コマンドを発行する必要があると思います
SET SCAN OFF
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;
(未テスト、手元にオラクルボックスがなく、しばらく経っています)
SQL/Plus の使用をやめて ください。SQL ツール以上のものであるPL/SQL Developerを強くお勧めします。
ps TOADを好む人もいます。