【问题标题】:hsqldb Oracle mode select for update NOWAIThsqldb Oracle 模式选择更新NOWAIT
【发布时间】:2015-11-14 13:45:01
【问题描述】:

HSQLDB 在 Oracle 语法中似乎不支持 NOWAIT。

HSQLDB 版本:2.3.3

与

SET DATABASE SQL SYNTAX ORA TRUE;

SQL 产生的异常

select a, b, c from sometable where id=1 for update NOWAIT

例外

Caused by: org.hsqldb.HsqlException: unexpected token: NOWAIT
at org.hsqldb.error.Error.parseError(Unknown Source)
at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
  1. 有谁知道 HSQLDB 不支持这个吗?
  2. 任何想法如何在不修改原始 SQL 的情况下避免此异常。我可以在单元测试中忽略NOWAIT 功能,但不能修改SQL。附加信息:我们使用 spring-jbdc 和 JdbcTemplate 并考虑拦截它以用 NOWAIT 替换 sqls 作为 JUnit 测试设置中的 hack。

【问题讨论】:

    标签: oracle hsqldb spring-jdbc


    【解决方案1】:

    在sourceforge上挖掘hsqldb源代码后终于找到了我自己的问题的答案。

    HSQLDB 2.3.3 版不支持NOWAIT。

    我已经在他们的论坛中提出了这个问题并提出了这个问题,但它不像 GitHub 那样您可以创建问题,因此没有打开正式的问题/请求。

    我现在正在修改 HSQLDB 自己的代码 org.hsqldb.ParserDQL 类以忽略 select-for-update SQL 中的NOWAIT。

    如果有人有更好的答案,我会接受他们的答案。

    更新:(2015 年 8 月 24 日)

    从 HSQLDB 论坛收到确认 NOWAIT 将被忽略。同时,我发布了代码 sn-p 以忽略我从 HSQLDB sourceforge 论坛收到的 NOWAIT。您可能希望等待 HSQLDB 的下一个版本,而不是将其添加到您的代码库(作为 hack)。

     if (Tokens.T_NOWAIT.equals(token.tokenString)) {
            read();
     }
    

    更新以显示在 ParserDQL.java 中添加上述 sn-p 位置的完整上下文

        /**
     * Retrieves a SELECT or other query expression Statement from this parse context.
     */
    StatementQuery compileCursorSpecification(RangeGroup[] rangeGroups,
            int props, boolean isRoutine) {
    
        OrderedHashSet  colNames        = null;
        QueryExpression queryExpression = XreadQueryExpression();
    
        if (token.tokenType == Tokens.FOR) {
            read();
    
            if (token.tokenType == Tokens.READ
                    || token.tokenType == Tokens.FETCH) {
                read();
                readThis(Tokens.ONLY);
    
                props = ResultProperties.addUpdatable(props, false);
            } else {
                readThis(Tokens.UPDATE);
    
                props = ResultProperties.addUpdatable(props, true);
    
                if (token.tokenType == Tokens.OF) {
                    readThis(Tokens.OF);
    
                    colNames = new OrderedHashSet();
    
                    readColumnNameList(colNames, null, false);
                }
                if (Tokens.T_NOWAIT.equalsIgnoreCase(token.tokenString)) {
                    readIfThis(Tokens.X_IDENTIFIER);
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多