2017-01-09 3 views
0

Oracle 데이터베이스 용 MyBatis DAO 계층에 대한 테스트를 작성 중이며 배치 삽입 작업에 문제가 있습니다. 오라클 문 INSERT ALL로 구현되어 실제 데이터베이스에 대해H2 데이터베이스는 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을 사용하고 있습니다. 테스트 데이터베이스의 구성 : 저는 SQL 구문 오류를 받고 있어요 일괄 삽입에 대한 테스트 동안

<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> 

:

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 []; 

내가 INSERT ALL 문 H2 데이터베이스에서 지원하지 않는 것으로 의심하고있다. 그렇지? 해결 방법은 없습니까? HSQLDB가 Oracle DAO 테스트에 더 적합 할 수 있습니까?

답변

2

H2 또는 HSQLDB는 오라클의 독점적 인 INSERT ALL 구문을 지원하지 않습니다. 오라클 인스턴스를 유닛/통합 테스트에 사용하기에는 부족하지만, 다른 방법이 있는지 확신 할 수 없습니다. 도킹 된 Oracle XE 컨테이너를 사용하여 테스트의 일부로 스핀 업할 수 있습니다. 또 다른 옵션은 개발자가 INSERT ALL에서 멀어지는쪽으로 들여다 보도록하는 것입니다.

+0

감사합니다. 지원되는 작업 목록은 어디에서 찾을 수 있습니까? – sphinks

+0

각각의 일반 문서에서. 다음은 H2 SQL 문법 [sql-grammer] (http://h2database.com/html/grammar.html)에 대한 링크입니다. 다음은 HSQLDB [sql-index] (http://www.hsqldb.org/doc/guide/sql-ind.html)에 대한 SQL 색인 부록입니다. –