Написать пользовательскую функцию H2 DB Java - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь запустить приведенный ниже код, используя H2DB (через тест junit), при этом я получаю сообщение об ошибке, как показано ниже. Я понимаю, что в H2 нет функции, доступной как "days". Поэтому я пытаюсь написать пользовательскую функцию, но она не работает, может ли кто-нибудь помочь в написании этой функции.

Код класса 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]

По какой-то причине дней конвертируются в ДНЕЙ [*] , мы видим это в сообщении об ошибке.

Метод клиента, который я пробовал в 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";
} 
';

applicationaiton.properties:

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

1 Ответ

0 голосов
/ 03 марта 2020

DAYS не является функцией и не поддерживается другими базами данных. Db2 также использует нестандартные интервальные литералы.

Если вы можете построить H2 из его текущих источников, вы можете использовать cast('1' AS integer) 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 будет совместим с более поздними версиями.

...