Как использовать HSQLDB в режиме синтаксиса запросов Oracle?
Я пытаюсь использовать HSQLDB как встроенную базу данных в приложении spring (для тестирования). Поскольку целевой производственной базой данных является Oracle, я бы хотел использовать функцию синтаксиса режима HSQLDBs.
В конфигурации spring я использую
<jdbc:embedded-database type="HSQL" id="dataSource">
</jdbc:embedded-database>
<jdbc:initialize-database data-source="dataSource" enabled="true">
<jdbc:script location="classpath:schema.sql"/>
</jdbc:initialize-database>
И в schema.sql наверху я написал:
SET DATABASE SQL SYNTAX ORA TRUE;
Однако при выполнении моего теста я получаю следующую ошибку:
java.sql.SQLException: Неожиданный токен: инструкция DATABASE в [SET DATABASE SQL SYNTAX ORA TRUE]
Является ли это синтаксической ошибкой или ошибкой разрешений или чем-то совершенно другим?
Спасибо - также за любые указатели, которые могут привести к ответу.
Учитывая, что HSQL является spring по умолчанию для jdbc: embedded-database и задан целью Oracle, этот сценарий должен быть очень распространенным. Тем не менее, я ничего не нашел в Интернете, даже коснувшись проблемы.
Update:
Вышеупомянутая проблема решена благодаря ответу # 1.
Однако теперь я получаю другое исключение:
org.springframework.dao.DataAccessResourceFailureException: не удалось заполнить базу данных; Вложенное исключение: java.sql.SQLException: java.lang.RuntimeException: неподдерживаемая внутренняя операция: неподдерживаемая внутренняя операция StatementCommand: StatementCommand
Любая идея, что это вызвано?
Ответы
Ответ 1
Этот параметр был введен с помощью HSQLDB 2.0.
Вы уверены, что используете правильную версию?
Возможно, у вас еще 1,8 все еще есть в пути к классам.
Но это не повлияет на вас с точки зрения тестирования в любом случае, потому что это включает только базовый синтаксис "замена", здесь нет реального изменения поведения (и я даже не говорю о более продвинутых функциях Oracle как аналитические функции, CONNECT BY или что-то подобное).
Очень редко рекомендуется тестировать ваше приложение с помощью СУБД, которая не будет использоваться в производстве. Это просто недействительный тест.
Ответ 2
Даже если он изменит только базовый синтаксис, вот пример того, как вы можете это сделать:
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:PUBLIC;sql.syntax_ora=true" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
Ответ 3
Свойство URL sql.syntax_ora=true
позволяет использовать синтаксическую совместимость, включая тип NUMBER и таблицу DUAL. Дополнительные свойства могут использоваться для большей совместимости с поведением. Они описаны в руководстве HSQLDB:
http://hsqldb.org/doc/2.0/guide/compatibility-chapt.html#coc_compatibility_oracle