SQL SERVER转换到ORACLE应注意的几点问题

来源:互联网 发布:background url 知乎 编辑:程序博客网 时间:2024/04/28 10:06
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.c1

2. 其他技术差异
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中的数据管道应该能够实现。
原创粉丝点击