How to use HSQLDB in Oracle query syntax mode?

2019-01-18 20:38发布

I am trying to use HSQLDB as an embedded database in a spring application (for testing). As the target production database is Oracle, I would like to use HSQLDBs Oracle syntax mode feature.

In the Spring config I use

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

And in schema.sql at the top I wrote:

SET DATABASE SQL SYNTAX ORA TRUE;

However, when running my test, I get the following error:

java.sql.SQLException: Unexpected token: DATABASE in statement [SET DATABASE SQL SYNTAX ORA TRUE]

Is this a syntax error or a permissions error or something entirely different?

Thanks - also for any pointers that might lead to the answer.

Given that HSQL is the Spring default for jdbc:embedded-database and given the target is Oracle, this scenario should actually be very common. However, I found nothing on the Web even touching the issue.

Update:

The issue above is resolved thanks to answer #1.

However, I now get another exception:

org.springframework.dao.DataAccessResourceFailureException: Failed to populate database; nested exception is java.sql.SQLException: java.lang.RuntimeException: unsupported internal operation: StatementCommand unsupported internal operation: StatementCommand

Any idea what this is caused by?

标签: hsqldb
3条回答
我只想做你的唯一
2楼-- · 2019-01-18 20:58

Even if it only change some basic syntax here is an example of how you can do it:

<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楼-- · 2019-01-18 21:09

This option was introduced with HSQLDB 2.0.

Are you sure you are using the correct version?
Maybe you have 1.8 still in the classpath somewhere.

But that won't get you far in terms of testing anyway, because this only turns on some basic syntax "replacing", there is no real behaviour change involved here (and I'm not even talking about more advanced Oracle features like analytical functions, CONNECT BY or something similar).

It is very seldom a good idea to test your application with a DBMS that will not be used in production. It is simply not a valid test.

查看更多
The star\"
4楼-- · 2019-01-18 21:20

The sql.syntax_ora=true URL property enables syntax compatibility, including the NUMBER type and the DUAL table. Additional properties can be used for more behavior compatibility. These are documented in the HSQLDB Guide:

http://hsqldb.org/doc/2.0/guide/compatibility-chapt.html#coc_compatibility_oracle

查看更多
登录 后发表回答