java - 准备语句: Missing expression on single quote (ORA-00936)

标签 java oracle jdbc prepared-statement ojdbc

我正在查询 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
    }
}

并且从用户处接收输入字符串。此调用适用于普通输入字符串,例如:

hello world
special: characters 0_2 (ftlo) -

但是对于像这样的输入字符串失败:

7-8 l/o y-S '

(注意末尾的破折号、正斜杠和单引号)

我假设它与单引号有关,但我的印象是 PreparedStatement 会为您处理所有转义。有没有人见过这样的问题,或者了解有关 oracle JDBC 驱动程序中的字符转义的更多信息?

我正在使用:

  • Java:1.8.0_181
  • Jboss:EAP 6.4.7.GA
  • JDBC:ojdbc6 版本 11.2.0.3.0
  • 数据库:Oracle Database 11g 企业版版本 11.2.0.4.0 - 64 位生产版

堆栈跟踪:

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>

最佳答案

事实上,我收到的错误与我想象的不同。我的 ResultSetHandler 在主查询完成后执行一些额外的清理逻辑,这会引发 SQLException(缺少表达式)。由于 apache DButils 和 JDBC 库的实现,错误被吞没并且没有以有用的方式打印。抱歉造成困惑。

关于java - 准备语句: Missing expression on single quote (ORA-00936),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52634542/

相关文章:

java - 违反主键约束***'。无法在对象错误中插入重复键

java - 运行时 Json 字符串到 Java 对象

java - 在 Junit-4.11 中找不到类

Oracle 解释计划估计索引范围扫描的基数不正确

sql - 将 current_date 转换为相对日期和静态时间

java - 使用JDBC访问远程MySQL数据库时出现com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

Java - 从图像中获取像素数组

java - ArrayList<> 中元素之间的 Line2D

sql - 将 oracle 的 listagg 转换为 postgres

java - 带有 Webflux 的 JDBC - 如何分派(dispatch)到容器线程