Я пишу тесты для уровня 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?
спасибо! Где вы находите список поддерживаемых операций? – sphinks
Из каждой соответствующей общей документации. Вот ссылка на 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) –