【问题标题】:ORA-00907 when quering from my Java application but works fine in SQL DeveloperORA-00907 从我的 Java 应用程序查询但在 SQL Developer 中工作正常
【发布时间】:2013-05-11 16:35:51
【问题描述】:

我放入准备好的语句的查询是:

select * 
  from ( select seq, audit_ts, message_type
           from log2 
          where 1 = 1 
            and message_type in ('SOURCE', 'DEST') 
          order by seq desc ) 
 where ROWNUM <= ?

当我在我的应用程序中运行查询时,我得到:

java.sql.SQLSyntaxErrorException: ORA-00907: 缺少右括号

编辑:这是执行查询的java。我正在尝试返回一组搜索结果,因此前缀包含 SELECT 语句,然后我可以有任意数量的后缀(在此摘录“AUDIT_LOG_SEARCH2”中),它们是基于用户搜索的参数化 WHERE 子句:

StringBuffer query = new StringBuffer(300);
query.append(dbAdapter.getQuery("AUDIT_LOG_ENTRY_PREFIX"));
query.append(dbAdapter.getQuery("AUDIT_LOG_SEARCH2"));

// Insert parameters to complete the sql prepared statement 
PreparedStatement ps = _dbConn.prepareStatement(query.toString());
ResultSet rs = ps.executeQuery();

但是当我在 SQL Developer 中单独运行时,查询运行良好。该查询最初是为 Postgres 创建的,然后为 Oracle 更新。有什么建议吗?

【问题讨论】:

  • 不要认为这些都是相关的,但是:seq 和 seq_num 是不同的列;以及您为绑定变量设置了什么值;你是如何执行它的,如execute 或executeQuery?可能有助于显示围绕此的 Java 代码。
  • 那是非常好的 Oracle,所以问题可能出在你的 Java 代码上。你能发布你是如何构建查询的吗?我假设这是一堆潜在的条件(WHERE 1=1 是我在类似情况下做过的事情),但如果没有太多,你能发布整个块吗?
  • 看起来构建查询的逻辑在getQuery 方法中。您可以在query.append(dbAdapter.getQuery("AUDIT_LOG_SEARCH2")) 语句之后打印或记录query.toString() 的值,而不是追逐它吗?然后检查以确保它是您认为的那样。
  • @EdGibbs 是的,上面发布的 SQL 查询就是 query 中包含的内容
  • 你appending 的字符串是否有空格 - 你是否输出了你正在运行的实际查询字符串以确保它看起来像你想的那样?我在想where 1 = 1and message_type in ('SOURCE', 'DEST'),缺少一个空格并变得无效?

标签: oracle oracle11g oracle-sqldeveloper ora-00907


【解决方案1】:

执行前需要将变量设置到preparedStatement中。

PreparedStatement ps = _dbConn.prepareStatement(query.toString());
ps.setInt(1, 10);

如果这不起作用,请发布query.toString() 为您提供的内容。不是query,而是query.toString()

你在做什么:

// Insert parameters to complete the sql prepared statement

您是否正确使用了ps.setString... 或其他方法?或者你只是替换问号?第二个可能会破坏您的查询。

【讨论】:

  • 该代码有注释// Insert parameters to complete the sql prepared statement,这似乎表明正在执行此操作,并且在注释中指出这发生在不带参数的查询中。无论如何它不会给出这个错误。
  • @AlexPoole 我的错,删除答案,直到一些反馈出现。
  • @AlexPoole 好吧,我又给了一个:P
【解决方案2】:

基于@AlexPoole 和@EdGibbs cmets,我决定添加更多调试语句。事实证明,如果满足某些条件,稍后会在程序中使用不同的 sql“后缀”递归调用该方法。后缀未更新为包装语句的新 ROWNUM 所需的括号。因此,尽管 ORA-00907 可以针对许多不同的格式问题抛出,但实际上是一个右括号导致了我的问题:P

前缀和后缀在这个代码库中似乎是一种奇怪的模式,用于创建 sql 查询。我正在考虑摆脱它并进行重构,因此不必像那样构建查询。有什么建议吗??

因此,对于遇到此 Oracle 错误的任何其他人,我建议记录您正在生成的 sql 语句并在 SQL Developer 中使用它。如果它在那里工作,但不能在您的应用程序中工作,那么您的代码可能正在做一些时髦的事情:P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多