Как получить следующее значение в последовательности, используя встроенную базу данных H2? - PullRequest
1 голос
/ 22 апреля 2020

Фон

Я использую Oralce в качестве базы данных и встроенную в память базу данных H2 для интеграционных тестов.

Я создал несколько таблиц в H2 и возможность получить некоторые вставленные данные. Однако я не смог получить текущее значение последовательности для последовательности, которую я создал в H2.

Я знаю, что Oracle и H2 не совпадают и используют похожий, но разный синтаксис. Мне также известно, что вы можете определить псевдоним в базе данных H2 в памяти и встроить код java вместо функций Oracle SQL. Это дает мне подсказку, что должен быть обходной путь при получении значения последовательности с использованием синтаксиса Oracle над базой данных H2.

Вопрос

Как мне сделать синтаксис Oracle для выбора текущего значения последовательности, работающей на H2? Нужно ли создавать псевдоним и писать встроенный код java вместо синтаксиса Oracle? Какие у меня варианты?

В тестируемом коде используется следующая гипотетическая, но похожая SQL

select myschema.mysequence.nextval from dual

Но я получаю ошибку, подобную следующей

org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "nextval" not found [42122-199]

Вероятно, очевидно, что это не сработает из-за разницы в синтаксисе. Я ищу обходной путь без необходимости изменения тестируемого кода, который использует синтаксис Oracle.

Обновления

Я использую Spring JDB * EmbeddedDatabaseBuilder 1046 * означает, что я подключаюсь не к отдельному независимому экземпляру базы данных H2, а к экземпляру, созданному на лету, в который я включаю сценарии DDL для создания объектов БД.

Следующий пост вместе с принятым ответом помогли решить его.

Поддерживает ли встроенная база данных Spring разные SQL диалекты?

1 Ответ

1 голос
/ 22 апреля 2020

Такое выражение Oracle в стиле фактически поддерживается H2, включая версию 1.4.199:

set mode Oracle;
create schema myschema;
create sequence myschema.mysequence;
select myschema.mysequence.nextval from dual;
> 1
select myschema.mysequence.nextval from dual;
> 2

Вы можете использовать синтаксис из стандарта SQL в H2, если вы используете sh, но это не поддерживается Oracle:

VALUES NEXT VALUE FOR myschema.mysequence;

Я понятия не имею, как вы получили Column "nextval" not found с вашим SQL; если схема или последовательность не существует, исключение будет другим.

Вам необходимо обновить свой вопрос реальным запросом или опубликовать его в отдельном вопросе, поскольку этот вопрос уже содержит ответ в самом вопросе. : Ваш собственный пример запроса действителен для H2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...