版权所有:(xiaodaoxiaodao)蓝小刀    xiaodaoxiaodao@gmail.com

http://www.blogjava.net/xiaodaoxiaodao/archive/2007/06/11/123488.html       

转载请注明来源/作者

 

oracle 导入到sybase

 

oracle 数据库如何导入到sybase中,本来想网上应该有相应的工具,结果找了半天,有些徒劳无功,下面是我能够找到的几种据说可以进行互导的工具。

 

1 power transfersybase自己的工具,有人说可以进行数据库转换,不过在网上找了半天,也没有找到下载的地方,在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的字符集支持中文,如

sybase.JPG 

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中定义的完全一致。

 

注: 对于Languagechinese / Charactereucgb / Sortbinary只能大小写敏感的问题,我在网上找到了一篇文章,尝试去改sybase下的相应配置文件,希望可以大小写不敏感,结果没有成功,有兴趣的可以参考这篇文章尝试一下(自定义Sybase排序方式)。

 

我使用的是Languagechinese / Charactereucgb / Sortbinary,结果在转换代码的时候把hibernate中的所有配置文件涉及到表名/字段名的地方全部改成了大写,还好是用hibernate,改动的地方不是很多(sybase的驱动可以在sybase安装目录下的\jConnect-5_5\classes\jconn2.jarjConnect-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中为VARCHAR2sybase中为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编码

 

注:对于oracleBLOB/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'

 

 

版权所有:(xiaodaoxiaodao)蓝小刀    xiaodaoxiaodao@gmail.com