【发布时间】:2016-11-17 01:31:12
【问题描述】:
我正在处理的项目有一个 Oracle 11 数据库,可以像这样访问
SELECT *
FROM (
SELECT row_number() over (ORDER BY acme_dept.LOG_TABLE.LOG_TIME ASC) rn,
acme_dept.LOG_TABLE.LOG_TIME,
acme_dept.LOG_TABLE.LOG_LEVEL,
acme_dept.LOG_TABLE.MESSAGE,
acme_dept.LOG_TABLE.CATEGORY,
FROM acme_dept.LOG_TABLE
)
WHERE rn BETWEEN #{first_row} AND #{last_row}
ORDER BY rn
这是用于有效地对请求进行分页的模式。这在生产中运行良好。
现在我想介绍用于单元测试的 HSQLDB。 (其他内存中的 DBMS 也可以。见下文。)但是,即使我使用 Oracle 语法兼容模式 SET DATABASE SQL SYNTAX ORA TRUE; 创建架构,我也会收到以下错误消息:
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: unexpected token: ORDER required: ) : line: 4 in statement [SELECT *
FROM (
SELECT row_number() over (
ORDER BY acme_dept.LOG_TABLE.LOG_TIME ASC) rn,
acme_dept.LOG_TABLE.LOG_TIME,
acme_dept.LOG_TABLE.LOG_LEVEL,
acme_dept.LOG_TABLE.MESSAGE,
acme_dept.LOG_TABLE.CATEGORY,
FROM acme_dept.LOG_TABLE
)
WHERE rn BETWEEN #{first_row} AND #{last_row}
ORDER BY rn
//// stacktrace ommited ////
这是 HSQLDB 的问题吗?只是可能没有实施。
我能做些什么吗?
HSQLDB 的替代品有更好的 Oracle SQL 支持吗?
是否有另一种分页模式,它在 Oracle 中很有效——不仅 LOG_TABLE 随着时间的推移变大——而且在 HSQLDB 中可用?
还是我错过了什么?
更新:不幸的是,应用程序正在 Oracle 11 上运行。
【问题讨论】:
-
HSQLDB 不支持窗口函数(目前没有嵌入式 DBMS 支持)。如果您使用的是 Oracle 12,则可以使用
offset x fetch first y rows only。这也适用于 HSQLDB。但是这样做时你会发现许多其他的小差异,这使得(至少在我看来)测试毫无意义 -
@a_horse_with_no_name 你得到了正确的答案。请张贴作为答案。
标签: oracle hsqldb window-functions in-memory-database