1

我正在尝试使用 H2DB(通过 junit 测试)运行以下代码,同时我收到如下错误消息。据我所知,H2 中没有“天”可用的功能。所以我正在尝试编写一个自定义函数,但它没有成功,任何人都可以帮助编写这个函数。

SQLBuilder 类代码:

public String dummy() {
        return new StringBuilder(new SQL() {
            {
                SELECT("date(CREATE_TMS)");
                SELECT("CASE WHEN date(CREATE_TMS) >= (CURRENT DATE - cast('1' AS integer) days) THEN 'Y' ELSE 'N' END NEW_B");
                FROM("Q.DUMMY");
            }
        }.toString().concat(" FOR READ ONLY WITH UR")).toString();
    }

错误信息:

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT DATE(CREATE_TMS), CASE WHEN DATE(CREATE_TMS) >= (CURRENT DATE - CAST('1' AS INTEGER) DAYS[*]) THEN 'Y' ELSE 'N' END NEW_BILLING
FROM Q.DUMMY FOR READ ONLY WITH UR "; expected "[, ::, *, /, %, +, -, ||, ~, !~, NOT, LIKE, ILIKE, REGEXP, IS, IN, BETWEEN, AND, OR, ,, )"; SQL statement:
SELECT date(CREATE_TMS), CASE WHEN date(CREATE_TMS) >= (CURRENT DATE - cast('1' AS integer) days) THEN 'Y' ELSE 'N' END NEW_BILLING
FROM Q.DUMMY FOR READ ONLY WITH UR [42001-199]

由于某种原因,天数被转换为DAYS[*],我们可以在错误消息中看到这一点。

我在 schema-db2.sql 中尝试的客户方法:

drop ALIAS if exists days; 
CREATE ALIAS days as '
import java.lang.String;
@CODE
java.lang.String days() throws Exception { 
  return "days";
} 
';

应用程序属性:

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;Mode=DB2
4

1 回答 1

0

DAYS不是函数,也不是其他数据库支持的东西。Db2 还使用非标准区间文字。

如果您可以从其当前来源构建 H2,则可以cast('1' AS integer) day在其中使用(而不是 day s),并且 Db2 也支持这种构建。您也可以简单地使用1 DAY,当前的 H2 和 Db2 也支持它。

(CURRENT_DAY - 1 DAY)

H2 的源代码可在 GitHub 上找到:

https://github.com/h2database/h2database

构建说明在这里:

https://h2database.com/html/build.html#building

你需要一个jar目标。

要从当前源编译 H2,您需要 JDK 8、9、10、11 或 12。编译后的 jar 将与更新的版本兼容。

于 2020-03-03T10:44:04.517 回答