【发布时间】:2013-05-11 16:35:51
【问题描述】:
我放入准备好的语句的查询是:
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 更新。有什么建议吗?
【问题讨论】:
-
不要认为这些都是相关的,但是:
seq和seq_num是不同的列;以及您为绑定变量设置了什么值;你是如何执行它的,如execute或executeQuery?可能有助于显示围绕此的 Java 代码。 -
那是非常好的 Oracle,所以问题可能出在你的 Java 代码上。你能发布你是如何构建查询的吗?我假设这是一堆潜在的条件(
WHERE 1=1是我在类似情况下做过的事情),但如果没有太多,你能发布整个块吗? -
看起来构建查询的逻辑在
getQuery方法中。您可以在query.append(dbAdapter.getQuery("AUDIT_LOG_SEARCH2"))语句之后打印或记录query.toString()的值,而不是追逐它吗?然后检查以确保它是您认为的那样。 -
@EdGibbs 是的,上面发布的 SQL 查询就是
query中包含的内容 -
你
appending 的字符串是否有空格 - 你是否输出了你正在运行的实际查询字符串以确保它看起来像你想的那样?我在想where 1 = 1and message_type in ('SOURCE', 'DEST'),缺少一个空格并变得无效?
标签: oracle oracle11g oracle-sqldeveloper ora-00907