45

& 文字を含む挿入ステートメントを作成するにはどうすればよいですか? たとえば、データベースの列に「J&J Construction」を挿入したいとします。

違いがあるかどうかはわかりませんが、Oracle 9i を使用しています。

4

14 に答える 14

68

私はこれを忘れ続け、また戻ってきます!最良の答えは、これまでに提供された回答を組み合わせることだと思います。

まず、 & は sqlplus/sqldeveloper の変数プレフィックスであるため、問題が発生します。これが表示されると、変数名の一部であると予想されます。

SET DEFINE OFF は、このように sqlplus の解釈を停止します。

しかし、sqlplus 変数とリテラル & 文字を使用する必要がある場合はどうでしょうか?

  • 変数を機能させるには SET DEFINE ON が必要です
  • & の使用をエスケープするには、SET ESCAPE ON を使用します。

例えば

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 '#'
于 2009-01-04T05:07:20.790 に答える
20

SQLPLUS から実行している場合は、

SET DEFINE OFF  

それが踏むのを止めるために&特別な場合として

于 2008-09-30T12:37:30.187 に答える
15

別の解決策として、連結と chr 関数を使用します。

select 'J' || chr(38) || 'J Construction' from dual;
于 2013-04-12T15:48:08.480 に答える
8

正しい構文は次のとおりです。

set def off;
insert into tablename values( 'J&J');
于 2008-09-30T13:15:44.993 に答える
5

ASCII コードを文字列に変換する chr() 関数が常にあります。

すなわち。次のようなもの: INSERT INTO table VALUES ( CONCAT( 'J', CHR(38), 'J' ) )

于 2009-01-04T07:32:39.933 に答える
4

プログラムでは、常にパラメーター化されたクエリを使用します。SQL インジェクション攻撃や、SQL パーサーにとって特別なその他の文字を回避します。

于 2008-09-30T12:45:13.647 に答える
4

SET SCAN OFF は廃止され ました http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a90842/apc.htm

于 2008-09-30T12:40:30.213 に答える
4

'J'||'&'||'Construction' のような文字列を挿入できます。それは正常に動作します。

insert into table_name (col_name) values('J'||'&'||'Construction');
于 2016-04-06T06:50:23.603 に答える
2

次のオプションのいずれかを使用すると機能することがわかりました。

SET DEF OFF

また

SET SCAN OFF

データベースについて、一方が他方よりも優れているか、または「より適切」であるかを知るのに十分な知識はありません。また、どちらかより良いものがあれば教えてください。

于 2008-09-30T12:39:18.357 に答える
0

sql plusを使用している場合は、コマンドを発行する必要があると思います

SET SCAN OFF
于 2008-09-30T12:36:53.903 に答える
0
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;

(未テスト、手元にオラクルボックスがなく、しばらく経っています)

于 2008-09-30T12:39:06.097 に答える
0

SQL/Plus の使用をやめて ください。SQL ツール以上のものであるPL/SQL Developerを強くお勧めします。

ps TOADを好む人もいます。

于 2008-10-06T19:54:59.693 に答える