Oracle 从Java应用程序查询时使用ORA-00907,但在SQL Developer中运行良好

Oracle 从Java应用程序查询时使用ORA-00907,但在SQL Developer中运行良好,oracle,oracle11g,oracle-sqldeveloper,ora-00907,Oracle,Oracle11g,Oracle Sqldeveloper,Ora 00907,我在准备好的声明中提出的问题是: 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 <= ? 但当我在SQLDeveloper中单独运行查询时,查询运

我在准备好的声明中提出的问题是:

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 <= ?

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

您需要在执行前将变量设置到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…
或其他方法?或者你只是在替换问号?第二个可能会破坏您的查询。

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

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


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

不要认为这些都是相关的,但是:是
seq
seq_num
不同的列;您为bind变量设置了什么值;您是如何执行它的,如
execute
executeQuery
?围绕这一点展示Java代码可能会有所帮助。这是一个非常好的Oracle,所以问题可能在于您的Java代码。你能告诉我你是如何建立这个查询的吗?我假设这是一组潜在条件(1=1的
是我在类似情况下做过的事情),但是如果没有太多,你可以发布整个区块吗?看起来构建查询的逻辑在
getQuery
方法中。您是否可以在
query.append(dbAdapter.getQuery(“AUDIT\u log\u SEARCH2”)
语句之后打印出或记录
query.toString()的值,而不是将其记录下来?然后检查以确保它是您所认为的。@EdGibbs是的,上面发布的SQL查询包含在
query
中,您正在
append
中的字符串是否有空格-您是否输出了正在运行的实际查询字符串,以确保它看起来像您所想的那样?我认为
其中1=1和消息键入('SOURCE','DEST')
,缺少一个空格并变得无效?代码中有注释
//插入参数以完成sql预处理语句
,这似乎表明正在进行此操作,并且在注释中指出,在没有参数的查询中会发生这种情况。无论如何,它不会给出这个错误。@AlexPoole我的错,在收到反馈之前删除答案。@AlexPoole好吧,我又给出了一个:P
// Insert parameters to complete the sql prepared statement