【问题标题】:oracle query failing in in-memory hsqldb in oracle syntax mode在 oracle 语法模式下,在内存 hsqldb 中的 oracle 查询失败
【发布时间】:2015-04-29 15:29:35
【问题描述】:

以下查询在 hsqldb 2.3.2 中失败,sql.syntax_ora=true。
在 Oracle 11 中运行良好。
它是一个休眠的命名查询,在 TestNG 测试中使用到内存中的 hsqldb 而不是真正的 Oracle。 错误信息是:java.sql.SQLSyntaxErrorException: unexpected token: ORDER required: ) : line: 16, 指的是 row_number() over (order by lastUpdateTime desc) 区域:

select  
        id         as id1_9_0_,  
        version    as version2_9_0_,  
        lastUpdateTime as lastUpda7_9_0_,  
        eventType    as eventTyp3_9_0_,  
        clientJid    as clientJi4_9_0_,  
        topicName as topicNam5_9_0_,  
        attributes as attribut6_9_0_  
    from (select logEvents.id as id,  
                 logEvents.version as version,  
                 logEvents.lastUpdateTime as lastUpdateTime,  
                 logEvents.eventType as eventType,  
                 logEvents.clientJid as clientJid,  
                 logEvents.topicName as topicName,  
                 logEvents.attributes as attributes,  
                 row_number() over (order by lastUpdateTime desc) rn    from xyz_logEvent logEvents)  
    where rn between 1 and 4 order by rn;  

【问题讨论】:

    标签: sql oracle compatibility hsqldb named-query


    【解决方案1】:

    HSQLDB 并不支持所有可能的 SQL 语法。不支持row_number() over (order by ...),而支持row_number() over ()

    替代方案可能如下所示:

    (select logEvents.id as id,
    logEvents.version as version,
    logEvents.lastUpdateTime as lastUpdateTime,
    logEvents.eventType as eventType,
    logEvents.clientJid as clientJid,
    logEvents.topicName as topicName,
    logEvents.attributes as attributes,
    row_number() over () rn from xyz_logEvent logEvents order by lastUpdateTime limit 4)
    

    【讨论】:

    • 谢谢。这有帮助。虽然 limit 和 offset 不能用作 HIbernate Query(使用上述 sql-query)上的 setParameter,但 setFirstResult() 和 setMaxResults() API 有所帮助。唯一不幸的缺点是单元测试的一些查询现在与开发代码不同。 hsqldb 仍然比 h2 更兼容 Oracle。
    • 请向 HSQLDB 项目报告任何其他不兼容问题,以便在未来版本中解决。
    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2020-09-06
    • 2015-11-14
    相关资源
    最近更新 更多