HyperSQL(HSQLDB)之对Oracle的支持

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总还是需要的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值