我在准备好的语句中输入的查询是:
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。sqlsyntaxerroreexception: ORA-00907: missing right parenthesis
EDIT:下面是执行查询的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开发人员单独运行它。这个查询最初是为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开发人员。如果它在这里工作,但在您的应用程序中不起作用,那么您的代码可能会做一些奇怪的事情:P