1

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

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 更新。有小费吗?

4

2 回答 2

0

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

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

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

于 2013-05-20T19:58:27.170 回答
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...或其他方法?或者你只是替换问号?第二个可能会破坏您的查询。

于 2013-05-16T18:39:00.340 回答