【问题标题】:Oracles ROW_NUMBER () OVER (ODER BY ...) in HSQLDBHSQLDB 中的 Oracle ROW_NUMBER () OVER (ORDER BY ...)
【发布时间】: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


【解决方案1】:

如果您使用的是 Oracle 12,您可以使用也适用于 HSQLDB 的 ANSI SQL fetch first x rows only

SELECT 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
ORDER BY acme_dept.LOG_TABLE.LOG_TIME ASC
OFFSET #{first_row}
FETCH FIRST #{num_rows} ROWS ONLY 

您现有的代码有所不同:您需要指定每页要获取的行数,而不是最后一行的绝对行数(这就是我在示例中将 #{last_row} 更改为 #{num_rows} 的原因)


但总的来说,我认为在生产中使用不同的 DBMS 进行测试是个坏主意。在我看来,有太多细微的差异使测试无效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2012-04-13
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多