我正在尝试将HSQLDB用作spring应用程序中的嵌入式数据库(用于测试)。由于目标生产数据库是Oracle,我想使用HSQLDBs Oracle语法模式功能。
在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是jdbc:embedded-database的Spring默认值,并且鉴于目标是Oracle,这种情况实际上应该是非常常见的。但是,我甚至没有在网上发现这个问题。
更新
由于答案#1,上述问题得以解决。
然而,我现在得到另一个例外:
org.springframework.dao.DataAccessResourceFailureException:无法填充数据库;嵌套异常是java.sql.SQLException:java.lang.RuntimeException:不支持的内部操作:StatementCommand不支持的内部操作:StatementCommand
知道这是由什么引起的吗?
答案 0 :(得分:12)
此选项随HSQLDB 2.0一起引入。
您确定使用的是正确的版本吗? 也许你有1.8仍然在类路径的某个地方。
但是无论如何这都不会让你在测试方面走得太远,因为这只会打开一些基本的语法“替换”,这里没有真正的行为改变(我甚至不谈论更高级的Oracle功能)像分析函数,CONNECT BY或类似的东西)。
使用不会在生产中使用的DBMS测试您的应用程序是一个不错的主意。这根本不是一个有效的测试。
答案 1 :(得分:9)
即使它只改变了一些基本语法,也是一个如何做到的例子:
<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>
答案 2 :(得分:2)
sql.syntax_ora=true
网址属性支持语法兼容性,包括NUMBER类型和DUAL表。其他属性可用于更多行为兼容性。这些内容记录在HSQLDB指南中:
http://hsqldb.org/doc/2.0/guide/compatibility-chapt.html#coc_compatibility_oracle