2016-07-19 19 views
0

こんにちはこれはシンプルに見えますが、ここで問題が発生しています。JDBCとOracle DB:エスケープ(一重引用符)

まず、多くのUPDATE文の実行にStatement#executeBatchを使用しています。各更新ステートメントは、更新されるString値を持ちます。これらの文字列は一重引用符で囲みます。私は、Oracleのドキュメントごとに一重引用符を追加して、一重引用符の前に '\\\'を追加しようとしました。最初のものでは、私のクエリはスタックされ、10分後に出てこない。 2つ目は「バッチ処理:ORA-00927:等号が抜けています」というエラーです。

正しいアプローチは何ですか? 注 - PreparedStatementを使用してJDBCパラメータを使用することはできません。

助けてください。

+1

を使用することである理由を拡張してくださいPreparedStatementsを使用することはできません。 SQLを手動で構築してエスケープしようとすると、アプリケーションエラーやSQLインジェクション攻撃の脆弱性が残ります。 –

+0

PreparedStatementでもバッチ更新を使用できるかどうかはわかりませんでした。 javadocを使い、それができることを理解しました。コメントしてくれてありがとう。! – user1576882

答えて

2

あなたはこれは、次の例に

Statement stmt = con.createStatement(); 

stmt.addBatch("update tst set txt = q'['''''''']' where id = 1"); 
stmt.addBatch("update tst set txt = q'['''''''']' where id = 2"); 
stmt.addBatch("update tst set txt = q'['''''''']' where id = 3"); 
stmt.addBatch("update tst set txt = q'['''''''']' where id = 4"); 
stmt.addBatch("update tst set txt = q'['''''''']' where id = 5"); 
// submit a batch of update commands for execution 
int[] updateCounts = stmt.executeBatch(); 

を与えるq-quoted strinグラム例えばq'['''''''']'

を使用することができます。しかし正しい方法は、プリペアドステートメント

PreparedStatement stmt = con.prepareStatement("update tst set txt = ? where id = ?"); 
5.times { i -> 
    stmt.setString(1, "''''''''"); 
    stmt.setInt(2, i+1); 
    stmt.addBatch(); 
} 

// submit a batch of update commands for execution 
int[] updateCounts = stmt.executeBatch(); 
+0

PreparedStatementでもバッチ更新を使用できるかどうかはわかりませんでした。 javadocを使い、それができることを理解しました。コメントしてくれてありがとう。! – user1576882

関連する問題