2009-08-05 8 views
0

Java JDBCを使用してユーザーの入力をoracleに挿入しようとしています。私は挿入クエリを使用する必要があります。Java Oracle insertクエリ

Oracleの列タイプはvarchar2です。

ユーザーが特殊文字を入力していない場合は挿入できます。 ユーザーが#のような特殊文字を入力すると? /と$は例外を与えます

これらの特殊文字を解析するのを手伝ってください。私は私のプロジェクトでストアドプロシージャまたは呼び出し可能なステートメントを使用することはできません挿入クエリを使用する必要があります。

ありがとうございます。

答えて

7

私が知っている限りではOracleは、その文字列値をエスケープする必要はありません:

INSERT INTO some_table (my_varchar_column) VALUES ('my string with a ?'); 

は動作するはずです。

しかし、次のようにjava.sql.PreparedStatement必ず使用可能にする:

PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO some_table (my_varchar_column) VALUES (?)"); 
preparedStatement.setString(1, "my string with a ?"); 
preparedStatement.execute(); 

プリペアドステートメントを使用して、一般的には、データベースに対してSQLを実行するための推奨される方法です。パフォーマンスを助け、SQLインジェクション攻撃を防ぐのに役立ちます。

+0

こんにちはニック、返信用 感謝。Oracleは必要ありません ウル右に挿入するなど

、引用符を倍増エスケープ文字列..しかし、私は挿入しようとしているときに?Javaを介して..それは実際には文字列の一部であるパラメータと考えて –

+0

こんにちはAjay - あなたのJavaコードを投稿できますか?ドライバーは必要なエスケープを処理する必要があります。 –

1

SQL文字列定数でエスケープする必要がある唯一の文字は、単引用符です。文字列の末尾に混同する可能性があるという明白な理由からです。

JDBC PreparedStatementを使用している場合、疑問符はそれ自身パラメータの略です。あなたは(?、?)mytableは(フィールド1、フィールド2)の値に挿入

のようなものを書いて、その後、これらの値を設定するには、setステートメントを使用します。あなたが引用符で疑問符を囲むと、それは単なる文字列内の別の文字である必要があり、すなわち

mytableは(フィールド1、フィールド2)の値に挿入(?、「?」)

、1つのパラメータを持っていますか? 1つの文字列リテラル '?'。

PreparedStatement.setは、必要な引用符のエスケープを行います。自分でクエリを作成する場合は、エスケープするためのコードを組み込む必要があります。 (ただ、mytableは(フィールド1)の値(「「こんにちは 『』ボブは、言った」」)