Я запрашиваю базу данных Oracle следующим образом:
try (Connection c = dataSource.getConnection();
PreparedStatement p = c.prepareStatement(
"SELECT * FROM table WHERE column_string = ?")) {
p.setString(1, input);
try (ResultSet r = p.executeQuery()) {
// handle ResultSet
}
}
И строка input
получена от пользователя.Этот вызов работает для обычных входных строк, например:
hello world
special: characters 0_2 (ftlo) -
Но не удается выполнить ввод для такой строки:
7-8 l/o y-S '
(обратите внимание на тире, косую черту и одинарные кавычки вконец)
Я предполагал, что это связано с одинарной кавычкой, но у меня сложилось впечатление, что PreparedStatement
позаботится обо всем побеге для вас.Кто-нибудь видел подобные проблемы или знает больше о побеге символов в драйверах JDBC oracle?
Я использую:
- Java: 1.8.0_181
- Jboss: EAP 6.4.7.GA
- JDBC: ojdbc6 версия 11.2.0.3.0
- База данных: Oracle Database 11g Enterprise Edition, выпуск 11.2.0.4.0 - 64-разрядная версия
Stacktrace:
SQLSyntaxErrorException: ORA-00936: missing expression
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:462)
... <my classes>