2017-01-09 1 views
0

Я пишу тесты для уровня DAO MyBatis для базы данных Oracle и имею проблемы с операцией вставки в пакет. Он реализуется с утверждением Oracle INSERT ALL:Является ли база данных H2 совместимой с операцией Oracle «Вставить все»?

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

Я подозревал, что INSERT ALL оператор не поддерживается базой данных H2. Это так? Любое обходное решение? Может ли HSQLDB быть более подходящим для тестирования Oracle DAO?

ответ

2

К сожалению, ни H2, ни HSQLDB не поддерживают синтаксис Oracle INSERT ALL. Если у вас нет экземпляра Oracle для работы с модулем/интеграционными тестами, я не уверен, что есть другой способ. Вы могли бы изучить использование докционированного контейнера Oracle XE и развернуть его как часть вашего теста. Другой вариант - заставить разработчиков задуматься о переходе от INSERT ALL.

+0

спасибо! Где вы находите список поддерживаемых операций? – sphinks

+0

Из каждой соответствующей общей документации. Вот ссылка на H2 SQL Grammar [sql-grammer] (http://h2database.com/html/grammar.html). Вот приложение SQL Index для HSQLDB [sql-index] (http://www.hsqldb.org/doc/guide/sql-ind.html) –

Смежные вопросы