如何使用H2嵌入式数据库获取序列中的nextvalue?

问题描述 投票:0回答:1

背景

我正在使用Oralce作为数据库,并使用H2嵌入式内存数据库进行集成测试。

我已经在H2中创建了一些表,并且能够获取一些插入的数据。但是,我无法检索在H2中创建的序列的当前序列值。

我知道Oracle和H2并不相同,它们使用相似但不同的语法。我还知道,您可以在H2内存数据库中定义一些别名,并将Java代码嵌入Oracle SQL函数的环境中。这给了我一个提示,即在Oracle H2数据库上使用Oracle语法检索序列值时,必须有一种解决方法。

问题

我如何使Oracle的用于选择序列当前值的语法在H2上起作用?我是否需要创建别名并在Oracle语法中编写嵌入式Java代码?我有什么选择?

被测代码使用以下假设但相似的SQL

select myschema.mysequence.nextval from dual

但是我遇到类似以下的错误

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

很明显,由于语法上的不同,这是行不通的。我正在寻找一种解决方法,而不必更改使用Oracle语法的正在测试的代码。

java integration-testing h2 spring-jdbc
1个回答
0
投票

H2实际上支持这种Oracle样式的表达式,包括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;如果模式或序列不存在,则异常将有所不同。

您需要使用实际查询来更新您的问题,或者将其发布到单独的问题中,因为该问题本身已经包含问题的答案:您自己的示例查询对H2有效。

© www.soinside.com 2019 - 2024. All rights reserved.