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

标签 java integration-testing h2 spring-jdbc

背景

我使用 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 脚本来创建数据库对象。

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

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 的;如果模式或序列不存在,异常将不同。

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

关于java - 如何使用 H2 嵌入式数据库获取序列中的下一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61358820/

相关文章:

ruby-on-rails - 集成与验收测试......什么是 cucumber /牛排?

java - JPA/Hibernate 是否支持迁移?

java - Spring Boot针对不同的h2测试使用不同的data.sql文件

java - 在 java 中将 int 转换为 char - 我必须使用 ASCII 吗?

java - 如何在 Jgit 中 rebase

java - 如何将GraphiQL与Spring-Boot集成?

visual-studio-2010 - 大型 Visual Studio 解决方案中的单元/集成测试组织

java - 在生产中运行 JUnit 集成测试的最佳方式

java - 如何在 Android 中使用菜单从主 Activity 打开 Intent(MapView)

mysql - 为什么通过 H2 进行 spring-boot 测试,但它会将数据写入我本地的 mysql 数据库?