web-dev-qa-db-ja.com

Oracle pl-sqlエスケープ文字(「 '」の場合)

OracleでINSERTステートメントを実行しようとすると、INSERTステートメントにSQL Error: ORA-00917: missing commaの値があるため、Alex's Tea Factoryエラーが発生しました。

'をエスケープするにはどうすればよいですか?

31
Bishan

エスケープするには、引用符を2重にします。

INSERT INTO TABLE_A VALUES ( 'Alex''s Tea Factory' );
46
Codo

SQLでは、引用を別の引用でエスケープします。

SELECT 'Alex''s Tea Factory' FROM DUAL
9
Thilo

次の例のようにESCAPEを使用できます

ワイルドカード文字「_」は1文字と一致するために使用され、「%」は任意の文字の0回以上の出現と一致するために使用されます。これらの文字はSQLでエスケープできます。

SELECT name FROM emp WHERE id LIKE '%/_%' ESCAPE '/';

PL/SQL内でも同じように機能します。

 if( id like '%/_%' ESCAPE '/' )

これは、同様のパターンにのみ適用されます。たとえば、_や%をエスケープする必要のない挿入では、それらはいずれにせよプレーン文字として使用されます。任意の文字列では、 'でエスケープする必要があるのは'だけです。

7
ganapathydselva
SELECT q'[Alex's Tea Factory]' FROM DUAL
3
Siva

あなたの質問は、文字列を連結してINSERTステートメントを構築していることを暗示しています。文字列がユーザー入力に由来する場合、SQLインジェクション攻撃にさらされる可能性があるため、これは不適切な選択であることをお勧めします。より適切な選択は、パラメーターマーカーを使用し、値をマーカーにバインドすることです。 Oracle parameter markersを検索すると、特定の実装テクノロジに関する情報(C#とADO、JavaとJDBC、RubyとRubyDBIなど)が見つかるはずです。

共有してお楽しみください。

1
Bob Jarvis

ステートメントのすべてのアポストロフィを心配する代わりに。 q' Notation.を簡単に使用できます

SELECT q'(Alex's Tea Factory)' FROM DUAL;

この表記法の主要なコンポーネントは

  • q'は、表記の開始を示します
  • (は、ステートメントの開始を完全にエスケープすることを示すオプションのシンボルです。
  • Alex's Tea Factory(文そのものです)
  • )'表記の終わりを示すアポストロフィ付きの閉じ括弧。

そのように、アポストロフィを1つ1つ心配することなく記法にいくつ詰め込めば、それらはすべて安全に処理されます。

重要な注意

(を使用したため、)'で閉じる必要があり、他のシンボルを使用することはオプションであることを忘れないでください。たとえば、次のコードは前のコードとまったく同じように実行されます

SELECT q'[Alex's Tea Factory]' FROM DUAL;
0
Wael Assaf