【问题标题】:How to use HSQLDB in Oracle query syntax mode?Oracle查询语法模式下如何使用HSQLDB?
【发布时间】:2011-06-02 12:28:26
【问题描述】:

我正在尝试将 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 语法 ORA TRUE;

但是,在运行我的测试时,我收到以下错误:

java.sql.SQLException: Unexpected token: DATABASE in statement [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

知道这是什么原因造成的吗?

【问题讨论】:

  • 您找到解决 StatementCommand 错误的方法了吗?我现在在同一条船上。
  • 为什么不使用 H2 db 代替,与 oracle 兼容模式?

标签: hsqldb


【解决方案1】:

此选项是在 HSQLDB 2.0 中引入的。

您确定您使用的是正确的版本吗?
也许您在某个地方的类路径中仍然有 1.8。

但这不会让你在测试方面走得太远,因为这只会开启一些基本的语法“替换”,这里没有涉及到真正的行为改变(我什至没有谈论更高级的 Oracle 特性像分析函数、CONNECT BY 或类似的东西)。

使用不会在生产中使用的 DBMS 测试您的应用程序很少是一个好主意。这根本不是一个有效的测试。

【讨论】:

  • 啊,谢谢。是的 - 我当时是 1.7。我同意你的测试 - 但是,在我的情况下,这只是对 DB 的一个非常小的使用。
  • 2.0 对我不起作用,我必须使用较新的版本,(2.2.8)
  • 2.2.4 对我也不起作用(+1 to banterCZ,谢谢!)我也升级到 2.2.8...要么是升级,要么是 stackoverflow.com/questions/4628857/… 添加 ;sql .syntax_ora=true 到 URL
  • @a_horse_with_no_name 我认为针对使用生产方言的内存数据库运行单元测试是一个非常好的主意,因为它可以加快测试速度。如果测试需要很长时间,开发人员会跳过它们。当然,您还需要一个集成测试...理想情况下,只是在另一个构建阶段(例如,夜间构建)运行的相同测试的另一种配置。
【解决方案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>

【讨论】:

  • @borjab 你们在使用逗号还是分号方面仍然存在分歧
【解决方案3】:

sql.syntax_ora=true URL 属性支持语法兼容性,包括 NUMBER 类型和 DUAL 表。其他属性可用于更多的行为兼容性。这些都记录在 HSQLDB 指南中:

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

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2012-02-06
    • 2013-10-04
    • 2015-11-14
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多