http://www.blogjava.net/xiaodaoxiaodao/archive/2007/06/11/123488.html
oracle 导入到sybase
oracle 数据库如何导入到sybase 中, 本来想网上应该有相应的工具,结果找了半天,有些徒劳无功,下面是我能够找到的几种据说可以进行互导的工具。
1 .power transfer :sybase 自己的工具,有人说可以进行数据库转换,不过在网上找了半天,也没有找到下载的地方,在emule 上搜索也没有找到相关的资源,不知道到底行不行。
2 .Cross-Database Converter 5.0 :下载地址为 http://www.dbbalance.com/download.htm , 下载安装之后发现因为没有付钱,无法出现运行界面,此路不通。
3 .Oracle Sybase Import, Export & Convert Software :收费软件,是www.sobolsoft.com 出 的一个互导工具,结果现在官网地址都无法访问,不知道在哪里可以下载。
找不到解决办法,最后只好手动导数据库,其实所有的数据库互导无非是两个步骤:
1. 数据库表结构
2. 数据库中的数据 (对于存储过程的互导没有试验,不过应该是大同小异)
使用数据库版本如下
oracle : Oracle9i Release 9.2.0.1.0 – Production
sybase :Adaptive Server Enterprise/12.5.2
(oracle 版 本可通过 select * from v$version 查看,sybase 版 本可通过在command 命令行执行sqlsrvr –v 查 看)
oracle 导入到sybase 的步 骤如下:
1 .导出oracle 数据库结构 ,可以 用Toad 工具导出,"Database" ——"Export" ——"Table Scripts" , 导出到一文本文件如db_oracle_to_sybase_structure.sql ,文件内容为 :
CREATE TABLE OA_COMPANY
(
COMPANYID VARCHAR2(75 BYTE) NOT NULL,
COMPANYNAME VARCHAR2(255 BYTE) NOT NULL,
PORTALURL VARCHAR2(150 BYTE),
)
TABLESPACE OASPACE
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
CREATE TABLE OA_USER
(
USERID VARCHAR2(75 BYTE) NOT NULL,
COMPANYID VARCHAR2(75 BYTE) NOT NULL,
ACTIVE NUMBER(5),
CREATED_TS DATE,
CREATED_BY VARCHAR2(255 BYTE),
)
TABLESPACE OASPACE
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
ALTER TABLE OA_COMPANY ADD (
PRIMARY KEY (COMPANYID));
ALTER TABLE OA_USER ADD (
PRIMARY KEY (USERID));
ALTER TABLE OA_USER ADD (
FOREIGN KEY (COMPANYID)
REFERENCES OA_COMPANY (COMPANYID));
2 .导入到sybase 之 前,要手工对sql 语句进行转换
① 上面的数据类型
VARCHAR2(75 BYTE) ——〉VARCHAR(75)
NUMBER(5) ——〉NUMERIC(5)
可以全局替换一下,把"VARCHAR2" 替 换为"VARCHAR" ," BYTE" 替 换为"" ,"NUMBER" 替换为"NUMERIC"
"BLOB" 对应于"IMAGE" ,"CLOB" 对应于"TEXT"
② 把关于表空间的定义TABLESPACE OASPACE 给 删去,如上面文件中的删除线所示
③ 把字段没有声明允许为NULL 的 字段如"PORTALURL VARCHAR2(150 BYTE)," 修改为"PORTALURL VARCHAR2(150) NULL ," ,只有这样显示指定,生成的sybase 表字段才允许为NULL ,否则在sybase 中生成表结构后还需要手动更改
④ 把上面sql 中的分号"; " 还 有多余的"( " 及") " 去 掉,否则在sybase 中运行会报错,如
ALTER TABLE OA_COMPANY ADD (
PRIMARY KEY (COMPANYID)) ;
改为
ALTER TABLE OA_COMPANY ADD
PRIMARY KEY (COMPANYID)
修改后文件 db_oracle_to_sybase_structure.sql 内容 为:
CREATE TABLE OA_COMPANY
(
COMPANYID VARCHAR (75) NOT NULL,
COMPANYNAME VARCHAR(255) NOT NULL,
PORTALURL VARCHAR(150) NULL ,
)
CREATE TABLE OA_USER
(
USERID VARCHAR(75) NOT NULL,
COMPANYID VARCHAR(75) NOT NULL,
ACTIVE NUMBERIC (5) NULL ,
CREATED_TS DATE NULL ,
CREATED_BY VARCHAR(255) NULL ,
)
ALTER TABLE OA_COMPANY ADD
PRIMARY KEY (COMPANYID)
ALTER TABLE OA_USER ADD
PRIMARY KEY (USERID)
ALTER TABLE OA_USER ADD
FOREIGN KEY (COMPANYID)
REFERENCES OA_COMPANY (COMPANYID)
3 .导出数据库中的数据 ,可以用Toad 工 具导出,"Database" ——"Export" ——"Table Data" ,导出到一文本文件如db_oracle_to_sybase_data.sql ,文件内容为 :
INSERT INTO OA_COMPANY ( COMPANYID, COMPANYNAME, PORTALURL) VALUES (
'1', ' 苏州工业园区利维利信息有限公司', 'http:/www.sznjusoft.com');
commit;
INSERT INTO OA_USER ( USERID, COMPANYID,CREATED_TS, CREATED_BY) VALUES (
'1', '1', 'admin', TO_Date( '11/06/2007 03:02:18 下午', 'MM/DD/YYYY HH:MI:SS AM'));
commit;
4 .导入到sybase 之 前,要手工对sql 语句进行转换
① sybase 中没有TO_Date 函 数,在这里可以用getdate() 或NULL 代 替,如TO_Date( '11/06/2007 03:02:18 下午', 'MM/DD/YYYY HH:MI:SS AM') 变为getdate() 或NULL (如果熟悉正则表达式,可 以使用正则来替换)
② 把上面sql 中每段的分 号去掉,否则在sybase 中运行会报错
修改后文件 db_oracle_to_sybase_data.sql 内容 为:
INSERT INTO OA_COMPANY ( COMPANYID, COMPANYNAME, PORTALURL ) VALUES (
'1', ' 苏州工业园区利维利信息有限公司', 'http://www.lively.com')
commit
INSERT INTO OA_USER ( USERID, COMPANYID,CREATED_TS, CREATED_BY) VALUES (
'1', '1', 'admin', getdate())
commit
5 .开始导入到sybase
① 首先导入表结构,执行db_oracle_to_sybase_structure.sql ,注意这里我们只执 行文件中的
CREATE TABLE OA_COMPANY
(
COMPANYID VARCHAR (75) NOT NULL,
COMPANYNAME VARCHAR(255) NOT NULL,
PORTALURL VARCHAR(150) NULL ,
)
CREATE TABLE OA_USER
(
USERID VARCHAR(75) NOT NULL,
COMPANYID VARCHAR(75) NOT NULL,
ACTIVE NUMBERIC (5) NULL ,
CREATED_TS DATE NULL ,
CREATED_BY VARCHAR(255) NULL ,
)
ALTER TABLE OA_COMPANY ADD
PRIMARY KEY (COMPANYID)
ALTER TABLE OA_USER ADD
PRIMARY KEY (USERID)
而生成表外键约束部分的sql 语 句在插入表数据之后再执行
注: 关于外键约束最后执行是因为在下面的 ② 中导入表数据时可能会出现子表数据在父表数据之前导入时会出现约束错误。
② 然后导入表数据,执行db_oracle_to_sybase_data.sql
③ 执行生成表外键约束部分的sql 语 句:
ALTER TABLE OA_USER ADD
FOREIGN KEY (COMPANYID)
REFERENCES OA_COMPANY (COMPANYID)
6 .注意在第5 步导入到sybase 之前必须确保sybase 的字符集支持中 文,如
①
Language :chinese
Character :eucgb Extended Unix Code for GB2312-80 (Simplified Chinese)
Sort :binary Binary ordering, for the EUC GB2312-80 character set (eucgb).
注意上面的设置字符集使得sybase 对 于大小写敏感,如select * from oa_user , 会提示找不到此表名,必须select * from OA_USER 才可以,不止对于表名,对于表中的字段和其它如视图也是一样,大小写必须与sybase 中 定义的完全一致。
注: 对于Language :chinese / Character :eucgb / Sort :binary 只能大小写敏感的问题,我在网上找到了一篇文章,尝试去改sybase 下 的相应配置文件,希望可以大小写不敏感,结果没有成功,有兴趣的可以参考这篇文章尝试一下(自定义Sybase 排序方式 )。
我使用的是Language :chinese / Character :eucgb / Sort :binary ,结果在转换代码的时候把hibernate 中的所有配置文件涉及到表名/ 字段名的地方全部改成了大写 ,还好是用hibernate , 改动的地方不是很多(sybase 的驱动可以在sybase 安 装目录下的/jConnect-5_5/classes/jconn2.jar 和jConnect-6_0/classes/jconn3.jar 找到)。
转换代码的时候遇到两个问题,一是对于下面这样的语句运行会报错
select userId , companyId from oa_user where companyId in (select distinct companyId companyId from oa_company where companyId in(select companyId from oa_company where oa_company . companyId = '1' ))
报错为:Incorrect syntax near ','.
Incorrect syntax near ')'.
后来发现把别名 companyId 去掉就可以正常运行了,尝试了一下,发现sybase 也是支持别名的,不知道是什么原因。
二是对于
select USERID from TITAN_USER user_ where user_ . USERID = 1
这样的语句,在oracle 中 运行是好的,转化为sybase 时,
会报错:Implicit conversion from datatype 'VARCHAR' to 'INT' is not allowed.
必须变为
select USERID from TITAN_USER user_ where user_ . USERID = '1'
(其中 USERID 在oracle 中 为VARCHAR2 ,sybase 中为VARCHAR )
② 如果要求sybase 大 小写不敏感,可以采用
Language :english
Character :iso-1
Sort :nocase Dictionary order, case insensitive.
的设置
后来因为项目需要不得已采用这种配置,发现关于字符编码的问题只需要在数据库连 接时采用jdbc.url=jdbc:sybase:Tds:192.168.155.151:5000/oaframeset? charset=cp936 这 样的设置就可以了,而所有页面均声明为
<%@ page pageEncoding="GBK" contentType="text/html; charset=GBK" %> ,
web.xml 中过滤器CharacterEncodingFilter 设 置为
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
注: 采用jdbc.url=jdbc:sybase:Tds:192.168.155.151:5000/oaframeset? characterEncoding=gbk 这样的配置发现无效, 从sybase 中读出的数据在页面上依然显示乱码,必须使用charset=cp936 。
EUCGB :GB2312-80 编码(即GB2312 )
CP936 :GB13000-90 编码(即GBK )
GB18030 :GB18030-2000 编码
注: 对于oracle 中BLOB/CLOB 字段(BLOB 主要存储二进制字节流 如附件,CLOB 存储大容量字符文本,如一篇新闻的内容)在sybase 中 相应的情况如下:
| oracle | sybase |
数据库类型 | BLOB /CLOB | IMAGE /TEXT |
Hibernate 中的module | byte[] /java.lang.String | byte[] /java.lang.String |
Hibernate 中的配置文件 | type="org.springframework.orm.hibernate3.support.BlobByteArrayType" /type="java.lang.String" | type="binary" / type="java.lang.String" |
附: sybase 的sql 执行可视化工具SQL Advantage ,比较小,功能也比较简单,不过使用 起来比较方便。
sql 执行也可以使用命令行工具isql 来 进行:
1 .连接:isql -U[Username] -P[Password] 。
如:isql -Usa -Psasasa
用户名:sa 密 码:sasasa
2 .isql 使用:写 完SQL 语句后回车,输入go ,然后回 车,即可执行相关SQL 语句( 执行sql 语句之前,可以用use dbname 命令然后 输入go 先进入相关的数据库)
有关sybase 的 问题可以到它的中文讨论区看看,Adaptive Server Enterprise 中文技术讨 论区
http://www.sybase.com.cn/gvswse/site/china/support_services/newsgroup.jsp
在Sybase 安装后使用中出现了两个错误:
unable to install language(s) because master database need 1 megabytes more of free space.
Task failed: install language(s).Terminating configuration.
Can't allocate space for object 'syslogs' in database 'master' because 'logsegment' segment is full/has no free extents. If you ran out of space in syslogs, dump the transaction log. Otherwise, use ALTER DATABASE to increase the size of the segment.
都是因为master 数 据库空间比较小造成的,所以最好在安装sybase 数据库完毕后立刻更改它的Database Devices 大小和master 数 据库空间大小,设置多少自己把握。
在设置前最好备份一下master 数 据库:
dump database master to 'D:/sybase/backup/master.dump'