java - H2数据库是否兼容Oracle 'Insert All'语句?

标签 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 测试?

最佳答案

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

关于java - H2数据库是否兼容Oracle 'Insert All'语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551222/

相关文章:

java - Apache/Tomcat 上的 Log4j 不工作

java - 使用 NetBeans 连接到 Java 中的 Access 数据库

java - 如何跟踪 Jackson 可能反序列化的类?

java - 无法将 java Web 应用程序部署到 Netbeans 中的 Tomcat

Spring AOP : passing target to Aspect

spring - 数据库读锁定

java - 未在 GAE 应用程序中调用 Spring 拦截器

c++ - 简单数据类型的 Oracle OCI 数组提取?

oracle - 这是 PL/SQL 错误吗?

database - 为什么在 where 条件下 oracle Number 字段忽略字符 d & f?