下载:
http://download.csdn.net/detail/shaoyy/3694238转换源码在SqlConvertToOracle.pas中,该转换过程负则将SQL Server的 一些语法特性翻译为Oracle支持的形式,也包括常用的函数,支持复杂的SQL,例如嵌套/子查询等。
这是小弟为了一个Oracle项目的应急之作,我们的系统(Delphi的三层架构)一直运行在sql server下面,当时客户指定需要的是支持Oracle版本的应用系统,这个系统不小,如果要将里面的SQL全部转换为Oracle,需要大量的时间及人力和物力,为了在短期内完成任务,小弟想到了“自动翻译”的方法,其难度是可想而知的,不过幸好我们的系统设计还算合理,所在的SQL都是由中间层一个统一的过程来执行的,在写好这个转换过程后,我在中间层那个执行SQL的过程中对调用者传进的SQL进行转换后再执行,就基本完成了整个系统的SQL语法从SQL Server到Oracle的兼容,呵呵,听起来有点不可思议。系统已经于3个月前上线,目前运行很稳定。如果有人用得着或发现什么问题,请加我的QQ:229481711,同时请支持一下本人的报表控件作品(Ac Report):
http://download.csdn.net/detail/shaoyy/3674310

解决方案 »

  1.   

    转换示例:SQL Server:
    select top 100 *, itemcode as code, abc = right(left(asdf, 3), 3), dd from (   
      select top 500 ab = dd, *, gg from OITG as G ) as #t   
    Where IsNull(ItemCode, '') like '%ss'自动翻译为Oracle:select T_t.*, itemcode code, SUBSTR(SUBSTR(asdf, 1, 3), -3, 3) abc, dd from (
     select dd ab, G.*, gg from OITG G Where ROWNUM <= 500) T_t   
     where (NVL(ItemCode, '') like '%ss') And ROWNUM <= 100 
      

  2.   

    还是自己写吧,理解业务的话,写SQL对于开发工程师不是任何的问题
      

  3.   


    写sql确实不是问题,只是特殊情况下,需要短时间内将sql server下的移值到oracle是一件很痛苦的事情,所以写了这么个东西。
      

  4.   

    转换好像非常复杂。
    像是所有的自增长ID都得换成触发器+序列oracle自带有一个迁移工具,大多数SQL语法都能转换,但也遇到个问题,
    如有时会自动生成下面这个SQL,然后又说它语法有问题:
    CREATE   GLOBAL   TEMPORARY   TABLE   tt_v_address
    (
        address   UDT.ADDRESS_TYPE%TYPE  
    )
    好像建表时确实不能引用 %TYPE  这个的,也不知道oracle那个工具omw是怎么自动生成的
      

  5.   

    这代码里有没有Bug呢,如果批量转换,而其中又有隐藏的小错误,那么,部分SQL转换成功,部分SQL执行起来又有问题。到时候,修改出错的SQL估计是个难事了。借鉴借鉴转换的思想~~~
      

  6.   

    哈哈,强悍!
    SQLSERVER与ORACLE特性差别很大,你确信自动转换很合理吗?
      

  7.   


    这个过程只支持单个SQL的转换(主要用于动态转换的情景),不能转换存储过程(这方面有专业的工具)。仔细看一下我的应用场景就明白了。我们的系统将客户端传过来的SQL在中间层的一个过程里自动转换,然后执行,没有人工干预的可能。
      

  8.   

    前面的是玩笑,纯属娱乐...
    遇到这种情况基本都是每句SQL都重新检查一遍了,没办法语法差异太大,系统上线初期可能没什么问题,但是考虑后期数据量较大,一些SQL的执行效率就可能就不理想了,这是必须考虑和面对的.楼主说此方法是商业级别的,应该是经过了大量数据测试. 简单SQL可以借鉴这样的方式,但是复杂SQL还是建议重写.
      

  9.   

    我想看一下最常用的 update t1 set t1.f1=t2.f2,t1.f3=t2.f4  from  t2 where t1.f5=t2.f5
    自动转换以后的代码。
      

  10.   


    呵呵,看得出来兄弟是oracle高手,不过我们的系统数据量不会太大,暂时不用深入考虑效率问题,现在只是能让系统在oracle下跑起来,当然移植的过程中也是碰到不少问题,像存储过程之类的,肯定是人工重新写过的,只是散布在程序中大量的sql一个一个去改实在麻烦,所以才整这么个东西,但也不能保证每个sql都能满意转换,还是有很多sql是配合手工去修改的,这个东西的价值在于能转换那些在程序中大量分布,但又相对简单的sql,大概可以节省80%的工作量吧。
      

  11.   


    结果如下:Merge Into t1
     Using t2 
     On t1.f5=t2.f5 
     When Matched Then Update Set t1.f1=t2.f2,t1.f3=t2.f4 (单表join的update还是比较简单的,但多个表的join一起update,就很复杂了)