H2数据库是否兼容Oracle' Insert All'声明?

时间:2017-01-09 15:22:16

标签: java spring oracle integration-testing h2

我正在为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测试吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,H2和HSQLDB都不支持Oracle专有INSERT ALL语法。如果没有为您的单元/集成测试启动并运行Oracle实例,我不确定是否还有另一种方法。您可以考虑使用dockerized Oracle XE容器并将其作为测试的一部分进行旋转。另一个选择是让开发人员考虑放弃INSERT ALL