背景
我使用Oracle作为数据库,并在集成测试中使用H2嵌入式内存数据库。
我已经在H2中创建了一些表格,并能够获得插入的数据。但是,我无法检索在H2中创建的序列的当前序列值。
我知道Oracle和H2不同,使用类似但不同的语法。我也知道你可以在H2内存数据库中定义一些别名,并嵌入Java代码来代替Oracle SQL函数。这提醒我,在H2数据库上使用Oracle的语法检索序列值必须有一种解决方法。
问题
如何使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 脚本。
以下帖子及其接受的答案有助于解决问题。
myDDL.sql
中使用了你的set mode Oracle;
,代码如下:new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScript("myDDL.sql").build()
但似乎并没有起到作用,我仍然得到相同的错误提示。 - supertonsky;MODE=Oracle
)。 - Evgenij Ryazanovnextval
,因为 H2 在这种错误消息中报告了列的全名。 - Evgenij Ryazanovnextval
是代码期望查询将用作输出的列名,但H2使用NEXT VALUE FOR MYSCHEMA.MYSEQUENCE
作为列名。为了解决这个问题,我不得不创建一个别名select myschema.mysequence.nextval nextval from dual
。实际上需要一个迷失的nextval
。 - supertonsky