sup*_*sky 7 java integration-testing h2 spring-jdbc
背景
我使用 Oralce 作为数据库,使用 H2 Embedded 内存数据库进行集成测试。
我在 H2 中创建了一些表并能够获取一些插入的数据。但是,我无法检索我在 H2 中创建的序列的当前序列值。
我知道 Oracle 和 H2 不一样,并且使用相似但不同的语法。我还知道您可以在 H2 内存数据库中定义一些别名并嵌入 java 代码来代替 Oracle SQL 函数。这给了我一个提示,即必须有一个解决方法,可以通过 H2 数据库使用 Oracle 语法检索序列值。
问题
如何使 Oracle 选择序列当前值的语法适用于 H2?我是否需要创建别名并编写嵌入式 java 代码来代替 Oracle 语法?我有什么选择?
被测代码使用以下假设但类似的 SQL
select myschema.mysequence.nextval from dual
Run Code Online (Sandbox Code Playgroud)
但我收到如下错误
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "nextval" not found [42122-199]
Run Code Online (Sandbox Code Playgroud)
由于语法的差异,很明显这是行不通的。我正在寻找一种解决方法,而无需更改使用 Oracle 语法的正在测试的代码。
更新
我正在使用 Spring JDBC 的 EmbeddedDatabaseBuilder,这意味着我不会连接到单独的独立 H2 数据库实例,而是连接到动态创建的实例,其中包含 DDL 脚本来创建 DB 对象。
以下帖子以及已接受的答案帮助解决了这个问题。
这样的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
Run Code Online (Sandbox Code Playgroud)
如果您愿意,您可以在 H2 中使用 SQL 标准中的语法,但 Oracle 不支持:
VALUES NEXT VALUE FOR myschema.mysequence;
Run Code Online (Sandbox Code Playgroud)
我不知道Column "nextval" not found你的 SQL 是怎么得到的;如果模式或序列不存在,则异常将有所不同。
您需要用真实的查询更新您的问题,或者将其发布在单独的问题中,因为该问题本身已经包含答案:您自己的示例查询对于 H2 有效。