hsqldb Oracle模式选择更新NOWAIT

时间:2015-08-20 19:04:22

标签: oracle hsqldb spring-jdbc

在Oracle语法中,HSQLDB似乎不支持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替换为使用JUnit测试设置中的hackAit。

1 个答案:

答案 0 :(得分:2)

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

HSQLDB版本2.3.3不支持NOWAIT。

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

我现在正在使用一个糟糕的黑客来修改HSQLDB代码自己org.hsqldb.ParserDQL类,只是忽略select-for-update SQL中的NOWAIT。

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

更新:(2015年8月24日)

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

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

更新以显示在ParserDQL.java中添加上述代码段的完整上下文

    /**
 * 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);
            }
        }
    }