H2数据库兼容Oracle 'Insert All'语句吗?
Is H2 database compatible with Oracle 'Insert All' statement?
我正在为 Oracle 数据库的 MyBatis DAO 层编写测试,但批量插入操作有问题。它是用Oracle语句INSERT ALL
:
实现的
<insert id="batchInsertElements" parameterType="java.util.List" useGeneratedKeys="false">
INSERT ALL
<foreach collection="list" item="element">
INTO table1
(
col1, col2, col3, col4
)
VALUES
(
#{element.col1},
(select nvl(c.ID, -1) from table2 c where c.name = #{element.col2}),
#{element.col3},
#{element.col4}
)
</foreach>
SELECT 1 FROM DUAL
</insert>
针对真实数据库,它没有错误。对于测试,我使用 H2 数据库和 spring-dbunit。测试数据库的配置:
<bean id="testDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=Oracle" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
在批量插入测试期间,我遇到 SQL 语法错误:
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "INSERT ALL[*]
INTO TABLE1
(
COL1, COL2, COL3, COL4
)
VALUES
(
?,
(SELECT NVL(C.ID, -1) FROM TABLE2 C WHERE C.NAME = ?),
?,
?
)
SELECT 1 FROM DUAL "; expected "INTO";
[42001-193]; bad SQL grammar [];
我怀疑 H2 数据库不支持 INSERT ALL
语句。是这样吗?任何解决方法? HSQLDB能不能更适合Oracle DAO测试?
不幸的是,H2 和 HSQLDB 都不支持 Oracle 专有的 INSERT ALL
语法。缺少 Oracle 实例和 运行 用于 unit/integration 测试,我不确定是否有其他解决方法。您可以考虑使用 dockerized Oracle XE 容器并将其启动作为测试的一部分。另一种选择是让开发人员考虑远离 INSERT ALL
.
我正在为 Oracle 数据库的 MyBatis DAO 层编写测试,但批量插入操作有问题。它是用Oracle语句INSERT ALL
:
<insert id="batchInsertElements" parameterType="java.util.List" useGeneratedKeys="false">
INSERT ALL
<foreach collection="list" item="element">
INTO table1
(
col1, col2, col3, col4
)
VALUES
(
#{element.col1},
(select nvl(c.ID, -1) from table2 c where c.name = #{element.col2}),
#{element.col3},
#{element.col4}
)
</foreach>
SELECT 1 FROM DUAL
</insert>
针对真实数据库,它没有错误。对于测试,我使用 H2 数据库和 spring-dbunit。测试数据库的配置:
<bean id="testDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=Oracle" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
在批量插入测试期间,我遇到 SQL 语法错误:
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "INSERT ALL[*]
INTO TABLE1
(
COL1, COL2, COL3, COL4
)
VALUES
(
?,
(SELECT NVL(C.ID, -1) FROM TABLE2 C WHERE C.NAME = ?),
?,
?
)
SELECT 1 FROM DUAL "; expected "INTO";
[42001-193]; bad SQL grammar [];
我怀疑 H2 数据库不支持 INSERT ALL
语句。是这样吗?任何解决方法? HSQLDB能不能更适合Oracle DAO测试?
不幸的是,H2 和 HSQLDB 都不支持 Oracle 专有的 INSERT ALL
语法。缺少 Oracle 实例和 运行 用于 unit/integration 测试,我不确定是否有其他解决方法。您可以考虑使用 dockerized Oracle XE 容器并将其启动作为测试的一部分。另一种选择是让开发人员考虑远离 INSERT ALL
.