我在准备好的陈述中的查询是:
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进行了更新。有什么提示吗?
答案 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