如鹏网 大学生计算机学习社区

CowNew开源团队

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  363 随笔 :: 2 文章 :: 808 评论 :: 0 Trackbacks
CowNewSQL多数据库翻译器在线演示已经开发完成,欢迎体验
http://211.99.196.18:6666/cownewdemo

由于访问人数众多,如果暂时无法访问,请稍后再试。
目前已经支持SQLServer、DB2、MySQL、Oracle四种数据库管理系统。
CowNewSQL源码和二进制包可以从CowNew网站(http://www.cownew.com )下载。
**********************************************
       由于种种原因,各个数据库系统的SQL语句语法以及支持的函数都不尽相同,这造成了如下两个问题:(1)使得系统在多个不同数据库之间移植变得非常困难,特别是需要维护多个数据库版本的时候;(2)开发人员必须对各种数据库的语法差异非常了解,这加大了开发难度。

       虽然Hibernate通过HQL等技术部分的解决了跨数据库移植的问题,但是在对性能要求比较高的场合还是需要直接使用SQL语句访问数据库的,在这种情况下如何编写能被不同数据库支持的SQL语句就成了。目前解决这种差异的最常用的技术就是SQL语句翻译,使用SQL翻译器可以将SQL语句翻译为在不同的数据库中支持的特定平台的SQL语句。CowNewSQL就是这样一款产品。

       CowNewSQL简化了跨数据库产品的开发,比如取当前日期在MSSQL中是“SELECT GETDATE()”,在MYSQL中是“SELECT NOW()”,在Oracle中是“SELECT SYSDATE FROM DUAL”,使用CowNewSQL以后您只要使用“SELECT NOW()”,那么CowNewSQL就会为您自动将其翻译为对应数据库平台支持的SQL语句,而且CowNewSQL的兼容性也非常好,比如“SELECT NOW()”写成“SELECT GETDATE()”同样可以被正确的翻译;取数据库前10条记录,在MSSQL中是“Select top 10 from T_1”、在MYSQL中是“SELECT  LIMIT 0, 10 ”、在Oracle中是“SELECT  FROM DUAL WHERE ROWNUM <= 10”,使用CowNewSQL以后您只要使用“Select top 10 from T_1”,那么CowNewSQL就会为您自动将其翻译为对应数据库平台支持的SQL语句。

       CowNewSQL还通过变通的方式对目标数据库不直接支持的语法进行了支持。比如MYSQL是不支持“select * from t1 where fid in(select fid from t2 limit 0,5)”这样在子查询中的Limit语句的,CowNewSQL通过将子查询进行二次结果集包装的方式巧妙的对其进行了支持,“delete from T_SaleInvoice where FId in(select top 5 FParentId from T_SaleInvoiceDetails)”通过CowNewSQL的翻译以后就成了“DELETE FROM T_SaleInvoice WHERE FId IN (select * from(SELECT FParentId FROM T_SaleInvoiceDetails LIMIT 0, 5 ) t_temp_sub)”这样被MYSQL支持的语法了;MYSQL中没有提供计算两个日期之间月份差异的函数,CowNewSQL通过组合其他日期函数的方式模拟了这个函数,这样使用者只要使用MONTHS_BETWEEN函数即可了,无需关心内部的差异。

       CowNewSQL支持如下几种类型的SQL语句:CreateTable/DropTable/CreateIndex/DropIndex/Select/Insert/Delete/Update;支持子查询、JoinUnion等高级的SQL特性;支持日期(包括取当前日期、从日期中提取任意部分、计算日期差异、日期前后推算等)、数学(包括取绝对值、取PI值、四舍五入、对数计算、随机数等)、字符串(包括取子字符串、取字符串长度、字符串截断、大小写转换等)、基本数据处理(包括数字字符串互转、日期转字符串、非空判断等)等函数。

posted on 2007-10-21 23:39 CowNew开源团队 阅读(1360) 评论(10)  编辑  收藏

评论

# re: CowNewSQL多数据库翻译器在线演示 2007-10-22 09:19 惊鸿逝水
是否支持Oracle 的Start With..... Connect by......?  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-10-22 11:12 BeanSoft
非常不错 支持了!  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-10-22 12:03 kitsionlee
关注,支持  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-10-22 19:58 CowNew开源团队
@惊鸿逝水
暂时不支持。我们会研究是否能在其他DBMS上模拟此语法,如果可以的话,我们会在后面的版本中对其提供支持。  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-11-11 19:40 惊鸿逝水
@CowNew开源团队

简单用了一下,也不支持:
SELECT * FROM (SELECT rownum n, a.* FROM (SELECT * FROM t_user )a WHERE rownum<=?) WHERE n>?

语句?  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-11-13 17:15 惊鸿逝水
也不支持select语句包含括号,函数,
select max(a1) from table

//MSSQLServer翻译结果
SELECT max(a1)
//MYSQL翻译结果
SELECT max(a1)
//Oracle翻译结果
SELECT max(a1) FROM DUAL
//DB2翻译结果
SELECT max(a1) FROM SYSIBM.SYSDUMMY1

语法解析器考虑不周全,希望能尽早修复这些BUG


  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-11-13 17:19 CowNew开源团队
@惊鸿逝水
"table"是SQL的关键字,所以不能用作表名,改为比如“select max(a1) from table1”就可以了。
“SELECT * FROM (SELECT rownum n, a.* FROM (SELECT * FROM t_user )a WHERE rownum<=?) WHERE n>?”这个请使用SQLServer的TOP语法,可以参考在线演示中的【样例】→【特色语法】→【取结果集前N条】。
感谢你的建议,:)。  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-11-13 17:23 惊鸿逝水
@CowNew开源团队

我看看了你们的sqltreeparser.g,from_clause 只支持table_elements,不支持select_elements ,所以使用SELECT rownum n, a.* FROM (SELECT * FROM t_user ) 出异常

本来我想修改一下,但发现
#(FROM_CLAUSE (table_element|select_elements)+) 也不正确,呵呵  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-11-13 17:28 CowNew开源团队
@惊鸿逝水
CowNewSQL是支持from_clause中的select_elements 。“SELECT rownum n, a.* FROM (SELECT * FROM t_user ) ”这句话不能正确翻译主要有如下两个原因:
(1)rownum 是关键字,所以不能用作列名。这个问题我们会在后续版本修改,只支持Top语法,这样解析也会快一点。不知是否可以?
(2)暂不支持a.*这样的表后的“*”,只支持,select * from ....。

改成“SELECT aa n, a.id,a.name FROM (SELECT * FROM t_user )”就可以通过翻译了。
  回复  更多评论
  

# re: CowNewSQL多数据库翻译器在线演示 2007-11-13 17:38 惊鸿逝水
very good!谢谢!

希望在后续版本可以看到这些改进:)

记得到时候通知一声啊,呵呵,十分感谢答复*-* 继续关注!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: