HSQL作为一个嵌入式DB,在开发过程中作为测试环境是非常方便的,本人也会经常将其作为简单Demo的DB。如了解ibatis的基础语法、Hibernate的HQL测试、Spring的JDBC支持等等,可以将其作为底层的数据库服务器。
尤其是后期的版本的HSQLDB,开始支持Oracle语法、MySQL语法、PostgreSQL语法等等,可喜的是基础性东西还是有的,不足的是对各个数据库语法支持的程度不一。就以Oracle来讲,每次写个Demo都开启Oracle服务,对我的小机子来讲是一个不小的压力,通过HSQLDB模拟一下Oracle环境总还是方便的,对Oracle的一些特别重要的特性HSQLDB都有支持。
不扯了,HSQLDB对Oracle的语法的支持不知道始于那个版本,以前使用HSQLDB的时候未发现有对Oracle语法的支持,我采用较新2.2.6版本。
启用Oracle语法可以通过二中途径,第一种是通过SQL语句声明,执行下列SQL语句
SET DATABASE SQL SYNTAX ORA TRUE;
第一种是在jdbc连接的url中启用,如下
jdbc:hsqldb:hsql://localhost:9001/huigoo;sql.syntax_ora=true
按官方文档的说法,HSQLDB将支持Oracle中特有的Dual表、ROWNUM语法、序列等特性。
我先测一下DUAL表
SELECT SYSDATE FROM DUAL;
可以看到支持查询系统时间。
对序列的支持比较简单,远没有Oracle中的那么完整,基础的东西还是有的
CREATE SEQUENCE SEQ_ARTICLE
INCREMENT BY 1
START WITH 1;
SELECT SEQ_ARTICLE.NEXTVAL AS VALUE FROM DUAL
让我比较痛苦的是对ROWNUM的支持,对这方面的处理做得及其憋足。一开始准备将其作为测试Oracle三层select嵌套分页的实例来使用,简单测试如下
SELECT A.*,ROWNUM RM FROM
(SELECT * FROM TB_ARTICLE)A WHERE ROWNUM <= 10
很欣慰,ROWNUM得到了支持,继续往下
SELECT * FROM(
SELECT A.*,ROWNUM RM FROM
(SELECT * FROM TB_ARTICLE)A WHERE ROWNUM <= 10)
WHERE RM >= 5
汗,居然给我搞了个查无结果,我非常确定这SQL语句没有错误。
冒汗中,在官方文档中寻找原因,得到结论HSQLDB中对ROWNUM只能使用小于,并不支持大于和等于。
这样说来就是用HSQLDB支持的分页写法吧,如下
SELECT A.*,ROWNUM FROM
(SELECT * FROM TB_ARTICLE)A
limit 0,10
最后,我意识到了,HSQLDB对标准的SQL支持还算完美,但对特定的SQL语法,如Oracle中特有、MySQL中特有的东西,支持并不好,反过来说,HSQLDB只作为测试使用,也未见得需要支持任何主流数据库语法,写标准的SQL总还是需要的。