OracleでINSERT
ステートメントを実行しようとすると、INSERT
ステートメントにSQL Error: ORA-00917: missing comma
の値があるため、Alex's Tea Factory
エラーが発生しました。
'
をエスケープするにはどうすればよいですか?
エスケープするには、引用符を2重にします。
INSERT INTO TABLE_A VALUES ( 'Alex''s Tea Factory' );
SQLでは、引用を別の引用でエスケープします。
SELECT 'Alex''s Tea Factory' FROM DUAL
次の例のようにESCAPEを使用できます
ワイルドカード文字「_」は1文字と一致するために使用され、「%」は任意の文字の0回以上の出現と一致するために使用されます。これらの文字はSQLでエスケープできます。
SELECT name FROM emp WHERE id LIKE '%/_%' ESCAPE '/';
PL/SQL内でも同じように機能します。
if( id like '%/_%' ESCAPE '/' )
これは、同様のパターンにのみ適用されます。たとえば、_や%をエスケープする必要のない挿入では、それらはいずれにせよプレーン文字として使用されます。任意の文字列では、 'でエスケープする必要があるのは'だけです。
SELECT q'[Alex's Tea Factory]' FROM DUAL
あなたの質問は、文字列を連結してINSERTステートメントを構築していることを暗示しています。文字列がユーザー入力に由来する場合、SQLインジェクション攻撃にさらされる可能性があるため、これは不適切な選択であることをお勧めします。より適切な選択は、パラメーターマーカーを使用し、値をマーカーにバインドすることです。 Oracle parameter markers
を検索すると、特定の実装テクノロジに関する情報(C#とADO、JavaとJDBC、RubyとRubyDBIなど)が見つかるはずです。
共有してお楽しみください。
ステートメントのすべてのアポストロフィを心配する代わりに。 q' Notation.
を簡単に使用できます
例
SELECT q'(Alex's Tea Factory)' FROM DUAL;
この表記法の主要なコンポーネントは
q'
は、表記の開始を示します(
は、ステートメントの開始を完全にエスケープすることを示すオプションのシンボルです。)'
表記の終わりを示すアポストロフィ付きの閉じ括弧。そのように、アポストロフィを1つ1つ心配することなく記法にいくつ詰め込めば、それらはすべて安全に処理されます。
重要な注意
(
を使用したため、)'
で閉じる必要があり、他のシンボルを使用することはオプションであることを忘れないでください。たとえば、次のコードは前のコードとまったく同じように実行されます
SELECT q'[Alex's Tea Factory]' FROM DUAL;