ORA-00907从我的Java应用程序查询但在SQL Developer中工作正常

时间:2013-05-16 16:57:20

标签: 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 <= ?

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

  

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进行了更新。有什么提示吗?

2 个答案:

答案 0 :(得分:0)

您需要在执行之前将变量设置为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...或其他什么?或者你只是更换问号?第二个可能是破坏了你的查询。

答案 1 :(得分:0)

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

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

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