如何使用 H2 嵌入式数据库获取序列中的下一个值?

How to get nextvalue in a sequence using H2 Embedded Database?

背景

我使用 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 JDBC 的 EmbeddedDatabaseBuilder,这意味着我不连接到一个单独的独立 H2 数据库实例,而是连接到一个动态创建的实例,我在其中包含用于创建数据库对象的 DDL 脚本。

以下 post 以及已接受的答案帮助解决了这个问题。

Does Spring embedded database support different SQL dialects?

这样的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

如果愿意,您可以在 H2 中使用 SQL 标准中的语法,但 Oracle 不支持它:

VALUES NEXT VALUE FOR myschema.mysequence;

我不知道你是怎么用你的 SQL 得到 Column "nextval" not found 的;如果模式或序列不存在,异常将不同。

您需要用您的真实查询或 post 在一个单独的问题中更新您的问题,因为这个问题本身已经包含一个答案:您自己的示例查询对 H2 有效。