我只是想把程序从使用oracle数据库改成用sql server2000,sql server 数据库结构与oracle数据库中的结构一样(表\字段等),他们对用powerbuilder写的程序有影响吗,如有影响,怎么解决呢

解决方案 »

  1.   

    基本上没什么好的办法,如果在程序开发时压根就没想到兼容数据库的问题,就只能检查所有的SQL,毕竟这两种数据库的语法相差还是比较大的.
      

  2.   

    同意hbwhwanghua(mikel) 的方法oracle有些东西,sql中是没有的,
    一些函数也都不一样
    这些都要相应的调整
      

  3.   

    把ORACLE数据库导出到硬盘上,再在SQL Server中导入不行吗?我记得好像可以.
      

  4.   

    接上:比如能从ORACLE中把数据导出到EXCEL,或者从EXCEL中导入到ORACLE,SQL中也可以这样做,那么能不能ORACLE-->EXCEL-->SQL呢?
      

  5.   

    zt
    SQL SERVER转换到ORACLE应注意的几点问题
    ..........................................................................1.部分SQL语句差异 (1)SQL:select top 10 * from table
         ORA: select * from table where rownum<11
    (2)SQL:Select * from t1 join t2 on t1.c1=t2.c1
         ORA: select * from t1,t2 where t1.c1=t2.c1
    (3)select * from t1 left join t2 on t1.c1=t2.c1
         ORA: select * from t1,t2 where t1.c1=t2.c1(+)
    (4)SQL:select * from t1 right join t2 on t1.c1=t2.c1
         ORA: select * from t1,t2 where t1.c1(+)=t2.c12. 其他技术差异
        GPRS技术可以应用的领域有:
        ◆在oracle中,delete语句中的from从句中不能涉及到多个表,要基于多个表进行删除记录只有使用子查询。;
        ◆在oracle中,update语句不能基于多个表进行修改数据,要基于多个表进行修改数据只有使用子查询;
        ◆在oracle中,存储过程不能返回记录集,如果要存储过程返回记录集,可以创建视图,可以单独执行select语句  (注意:并不是说在存储过程中不能使用select语句,但select只能用于以下情况:insert into table select * from t1 /select col1 into a from table where ……(a为一变量));
        ◆在oracle中insert 的语法是:insert into table values() 或insert into table select * from t1;;
        ◆Oracle中的日期型常量必须用to_date()函数得到。;
        ◆Dual表是一个虚拟表,专门用于测试的目的用,注意dual表的用法:
    在sql server中,如果我们项测试某个函数,例如:select convert(int,’13’) ,在 oracle 中这种表示方法是错误的,应表示为:select to_number(‘13’) from dual;;
        ◆得到相差的天数:两个日期相减,再用ceil或floor函数取整得到相差的月数:months_between()
        ◆数据类型的转换;
        ◆ORACLE中对象名不能超过30个字符。ORACLE中界限符是“”(对应SQLSERVER中的[ ])(我的建议是:最好不要是用界限符,能避免实用系统的保留字就尽量避免);
        ◆ORACLE中空字符串被看成null;
        ◆ORACLE中字符的比较是区分大小写的;
        ◆视图中如果用了order by ,并且order by 从句中的字段名都是别名,那么,在显示视图时必须显示出order by 子句中的所有字段,例如,有下面这样一个视图:
    create view v 
    as
    select name as c1,address from t1 order by c1
    那么在select 该视图时
    select c1,address from v   是正确的,   select address from v是错误的;
        ◆关于临时表的问题
          在sqlserver中 create table #table1 (c int);
          在oracle 中解决办法是:
    create global temporary table table1(c int) on commit preserve rows
    这个table1在数据库中是永久存在的,所以不要是用drop命令,在你的程序中在对这个表进行任何操作之前,先执行truncate table table1,切忌不要用drop命令删除此表。;
        ◆http://technet.oracle.com/doc/server815.htm这个网站有许多在线教程,但一定要先注册;    3. 数据类型转换SQL SERVER ORACLE 
        bigint       NUMBER (19 ,0)     
        binary  (50)      RAW (50)     
        bit       NUMBER (1, 0)     
        char  (10)    CHAR (10)     
        datetime       DATE     
        decimal (18 , 0)      NUMBER (18, 0)     
        float       FLOAT     
        image      BLOB 
        int      NUMBER (10, 0)     
        money       NUMBER (19 ,4)     
        nchar  (10)    CHAR (20)     
        ntext    CLOB 
        numeric (18 , 0)      NUMBER (18 ,0)     
        nvarchar  (50)    VARCHAR2 (100)     
        real       FLOAT     
        smalldatetime       DATE     
        smallint       NUMBER (5, 0)     
        smallmoney       NUMBER (10, 4)     
        sql_variant       LONG RAW     
        text    CLOB 
        timestamp       RAW (8) NOT     
        tinyint       NUMBER (3 ,0)     
        uniqueidentifier       LONG RAW     
        varbinary  (50)     RAW (50)     
        varchar  (50)  VARCHAR2 (50)   
    =======================================
    如何将一个数据库从sql server7.0(desktop) 移植到 oracle8i编号:QA004655
    建立日期: 2002年12月8日 最后修改日期:2002年12月8日 
    所属类别: 其他语言 - 数据库 冠冠: 
        操作系统:win2K profession版 
        编程工具:oracle8i 
        问题:如何将一个数据库从sql server7.0(desktop) 移植到 oracle8i(Enterprise) 中?包括把表结构,关键字,索引(如果把整个库中的数据一起导出来更好)。 
        水平: 刚入门 回答:     这篇文章是我以前收藏的,希望能够帮的上你,欢迎来信探讨! 
        1、使用MS SQL7.0自带的Import/Export工具 Import/Export工具可以方便的把数据移植到Oracle。你需要通过定义ODBC 
        For Oracle 作为目的源。这样的方法可以保证SQL7的绝大部分数据移植到Oracl e中去,但预先你必须在Oracle建立user 
        和 相应的tablespace。因为SQL7中有 一 些特殊的datatype,如text 、image等。当一个table中有多于一个text或 
        image 的字段时,将出现错误,不能执行。这是你需要做出选择,或者把text 镜像为v archar2(4000),或者镜像为Long 
        datatype,但long datatype一个table里只能 有一个。而且,还有可能遇到字符集的问题,最好用第三种方法或者第四 
        种。 
         
        2、使用Oracle Migration Workbanch。 目前的版本是2.2,这个工具可以在http://technet.oracle.com免费下载。 它是 
        Oracle提供的一个代替SQl*Loader的工具,当然目前该工具仍然不能完全取 代SQL*Loader。使用OMWB,只要你定义了 
        ODBC for MS SQL7 或Access或Sysbase ,就可以很方便的把tabels、views、triger、procedure、shortnaps、users等 
        完全转到Oracle中去,对于text,可以镜像为CLOB类型,CLOB类型可以在一个Or acle table里有多列。 image可以镜像为 
        BLOB。但是遗憾的是,OMWB2.2不支持 中 文CLOB,无论我如何调整,数据migrate到Oracle后,都变成了????,如果谁有 
        解 决的方法,别忘了email给我。我对OMWB对数据流(如image,video,sound)的控 制非常的欣赏。 
         
        3、使用Oracle的 SQL*Loader 使用SQL*Loader,也许是最不方便的方法,但是是最有效的方法。可以使用 各种方法把源 
        数据导到一个外部分件中。我使用了MS SQL7带的BCP工具,可以把 那些特殊多text字段的tables导出作为外部文件。然后 
        使用SQL*Loader在把这些 数据导到Oracle的一个临时表里,在对第2中方法出现的????字段进行update。 
         
        4、使用程序进行移植 例子:从SQL7.0向基于Linux下的Oracle数据库倒入数据: 程序语言:java 与数据库的连接 
        SQL7.0:jdbc-odbc桥,java自带。 Oracle:jdbc,Oracle提供。 代码如下: 
         
        import java.lang.*; 
        import java.sql.*; 
        import oracle.jdbc.driver.*; //倒入要用到的包 
         
        public class hhw extends Object 
        { public static void main(String args[]) throws SQLException, ClassNotFoundException //抛出SQLException异 
        常 { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
         
        Class.forName ("oracle.jdbc.driver.OracleDriver"); // 登记驱动程序,准备联接数据库 
         
        Connection cn1 =DriverManager.getConnection"jdbc:oracle:thin:@192.16 
        8.1.52:1521:SONIC", "sadly", "sadly"); 
         
        Connection cn2 =DriverManager.getConnection"jdbc:odbc:sql", "sa", "" ); //联接到数据库,建立到两个数据库的 
        连接 
         
        Statement s1=cn1.createStatement(); 
        Statement s2=cn2.createStatement(); 
        ResultSet rs1=s2.executeQuery("select * from users where id>0 and id<4 0000 "); //从数据源中取得数据,定义 
        一些中间变量 
         
        int id; 
         
        String name=new String("1"); 
        String passwd=new String("1"); 
        String email=new String("1"); //执行另一个查询,向目的数据库插入数据 
         
        while(rs1.next()) 
        {id=rs1.getInt(1); 
        name=rs1.getString("name"); 
        passwd=rs1.getString("passwd"); 
        email=rs1.getString("email"); //System.out.print(id+name+passwd+email); 
        s1.executeQuery("insert into bbsuser values(\\"+id+"\,\\"+name+"\,\\"+pas swd+"\,\\"+email+"\)"); } }} 
         
        cdzwm的意见: 
        用PB中的数据管道应该能够实现。