首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PreparedStatement:单引号缺少表达式(ORA-00936)

PreparedStatement:单引号缺少表达式(ORA-00936)
EN

Stack Overflow用户
提问于 2018-10-03 19:40:27
回答 3查看 363关注 0票数 0

我正在像这样查询Oracle数据库:

代码语言:javascript
复制
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字符串。此调用适用于正常的输入字符串,例如:

代码语言:javascript
复制
hello world
special: characters 0_2 (ftlo) -

但是这样的输入字符串失败了:

代码语言:javascript
复制
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数据库11g企业版发行版11.2.0.4.0-64位生产

堆栈跟踪:

代码语言:javascript
复制
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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-04 14:15:16

实际上,我收到了一个错误的代码,这与我想象中的不同。在主查询完成后,我的ResultSetHandler正在执行一些额外的清理逻辑,这就是抛出SQLException (缺失表达式)。由于apache和JDBC库的实现,错误被吞没并没有以一种有用的方式打印。很抱歉给你造成了混乱。

票数 1
EN

Stack Overflow用户

发布于 2018-10-03 19:59:38

可能是由于单引号的问题,因为在Oracle中,最后一个必须重复两次才能作为单引号输入,或者整个字符串必须包含在Q‘{.}’构造中,其中.是一个给定的字符串。

票数 0
EN

Stack Overflow用户

发布于 2018-10-03 20:46:10

无法繁殖。从ojdbc6-11.2.0.3.jar添加了这里文件。

在12.1.0.2服务器上运行MCVE代码(当然,getConnection的值已被屏蔽)。

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    test("hello world");
    test("special: characters 0_2 (ftlo) -");
    test("7-8 l/o y-S '");
    test("X");
}
private static void test(String input) throws SQLException {
    System.out.println(input);
    try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX:1521:XXX", "XXX", "XXX")) {
        String sql = "select DUMMY from DUAL where DUMMY = ?";
        try (PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, input);
            try (ResultSet rs = stmt.executeQuery()) {
                int count = 0;
                while (rs.next()) {
                    System.out.println("  " + rs.getString("DUMMY"));
                    count++;
                }
                System.out.println("  " + count + " rows");
            }
        }
    }
}

输出

代码语言:javascript
复制
hello world
  0 rows
special: characters 0_2 (ftlo) -
  0 rows
7-8 l/o y-S '
  0 rows
X
  X
  1 rows
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52634542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档