版權(quán)所有:(xiaodaoxiaodao)藍小刀
??
xiaodaoxiaodao@gmail.com
http://www.aygfsteel.com/xiaodaoxiaodao/archive/2007/06/11/123488.html
???
??
轉(zhuǎn)載請注明來源/作者
oracle
導(dǎo)入到sybase
oracle
數(shù)據(jù)庫如何導(dǎo)入到sybase中,本來想網(wǎng)上應(yīng)該有相應(yīng)的工具,結(jié)果找了半天,有些徒勞無功,下面是我能夠找到的幾種據(jù)說可以進行互導(dǎo)的工具。
1
.power transfer:sybase自己的工具,有人說可以進行數(shù)據(jù)庫轉(zhuǎn)換,不過在網(wǎng)上找了半天,也沒有找到下載的地方,在emule上搜索也沒有找到相關(guān)的資源,不知道到底行不行。
2
.Cross-Database Converter 5.0:下載地址為 http://www.dbbalance.com/download.htm,下載安裝之后發(fā)現(xiàn)因為沒有付錢,無法出現(xiàn)運行界面,此路不通。
3
.Oracle Sybase Import, Export & Convert Software:收費軟件,是www.sobolsoft.com出的一個互導(dǎo)工具,結(jié)果現(xiàn)在官網(wǎng)地址都無法訪問,不知道在哪里可以下載。
找不到解決辦法,最后只好手動導(dǎo)數(shù)據(jù)庫,其實所有的數(shù)據(jù)庫互導(dǎo)無非是兩個步驟:
1.?
數(shù)據(jù)庫表結(jié)構(gòu)
2.?
數(shù)據(jù)庫中的數(shù)據(jù)
(對于存儲過程的互導(dǎo)沒有試驗,不過應(yīng)該是大同小異)
使用數(shù)據(jù)庫版本如下
oracle
:
Oracle9i Release
sybase
:Adaptive Server Enterprise/
(oracle版本可通過
select
*
from
v$version
查看,sybase版本可通過在command命令行執(zhí)行sqlsrvr –v查看)
?
oracle
導(dǎo)入到sybase的步驟如下:
1
.導(dǎo)出oracle數(shù)據(jù)庫結(jié)構(gòu),可以用Toad工具導(dǎo)出,"Database"——"Export"——"Table Scripts",導(dǎo)出到一文本文件如db_oracle_to_sybase_structure.sql,文件內(nèi)容為:
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
.導(dǎo)入到sybase之前,要手工對sql語句進行轉(zhuǎn)換
①
上面的數(shù)據(jù)類型
VARCHAR2(75 BYTE)
——〉VARCHAR(75)
NUMBER(5)
——〉NUMERIC(5)
可以全局替換一下,把"VARCHAR2"替換為"VARCHAR"," BYTE"替換為"","NUMBER"替換為"NUMERIC"
"BLOB"
對應(yīng)于"IMAGE","CLOB"對應(yīng)于"TEXT"
②
把關(guān)于表空間的定義TABLESPACE OASPACE給刪去,如上面文件中的刪除線所示
③
把字段沒有聲明允許為NULL 的字段如"PORTALURL VARCHAR2(150 BYTE),"修改為"PORTALURL VARCHAR2(150) NULL,",只有這樣顯示指定,生成的sybase表字段才允許為NULL,否則在sybase中生成表結(jié)構(gòu)后還需要手動更改
④
把上面sql中的分號";"還有多余的"("及")"去掉,否則在sybase中運行會報錯,如
ALTER TABLE OA_COMPANY ADD (
? PRIMARY KEY (COMPANYID));
改為
ALTER TABLE OA_COMPANY ADD
? PRIMARY KEY (COMPANYID)
修改后文件
db_oracle_to_sybase_structure.sql
內(nèi)容
為:
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
.導(dǎo)出數(shù)據(jù)庫中的數(shù)據(jù),可以用Toad工具導(dǎo)出,"Database"——"Export"——"Table Data",導(dǎo)出到一文本文件如db_oracle_to_sybase_data.sql,文件內(nèi)容為:
INSERT INTO OA_COMPANY ( COMPANYID, COMPANYNAME, PORTALURL) VALUES (
'1', '
蘇州工業(yè)園區(qū)利維利信息有限公司', '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
.導(dǎo)入到sybase之前,要手工對sql語句進行轉(zhuǎn)換
①
sybase
中沒有TO_Date函數(shù),在這里可以用getdate()或NULL代替,如TO_Date( '11/06/2007 03:02:18 下午', 'MM/DD/YYYY HH:MI:SS AM')變?yōu)?span lang="EN-US">getdate()或NULL(如果熟悉正則表達式,可以使用正則來替換)
②
把上面sql中每段的分號去掉,否則在sybase中運行會報錯
修改后文件
db_oracle_to_sybase_data.sql
內(nèi)容
為:
INSERT INTO OA_COMPANY ( COMPANYID, COMPANYNAME, PORTALURL ) VALUES (
'1', '
蘇州工業(yè)園區(qū)利維利信息有限公司', 'http://www.lively.com')
commit
?
INSERT INTO OA_USER ( USERID, COMPANYID,CREATED_TS, CREATED_BY) VALUES (
'1', '1', 'admin',? getdate())
commit
5
.開始導(dǎo)入到sybase
①
首先導(dǎo)入表結(jié)構(gòu),執(zhí)行db_oracle_to_sybase_structure.sql,注意這里我們只執(zhí)行文件中的
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語句在插入表數(shù)據(jù)之后再執(zhí)行
注:
關(guān)于外鍵約束最后執(zhí)行是因為在下面的
②
中導(dǎo)入表數(shù)據(jù)時可能會出現(xiàn)子表數(shù)據(jù)在父表數(shù)據(jù)之前導(dǎo)入時會出現(xiàn)約束錯誤。
②
然后導(dǎo)入表數(shù)據(jù),執(zhí)行db_oracle_to_sybase_data.sql
③
執(zhí)行生成表外鍵約束部分的sql語句:
ALTER TABLE OA_USER ADD
? FOREIGN KEY (COMPANYID)
??? REFERENCES OA_COMPANY (COMPANYID)
6
.注意在第5步導(dǎo)入到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).
注意上面的設(shè)置字符集使得sybase對于大小寫敏感,如select * from oa_user,會提示找不到此表名,必須select * from OA_USER才可以,不止對于表名,對于表中的字段和其它如視圖也是一樣,大小寫必須與sybase中定義的完全一致。
注:
對于Language:chinese / Character:eucgb / Sort:binary只能大小寫敏感的問題,我在網(wǎng)上找到了一篇文章,嘗試去改sybase下的相應(yīng)配置文件,希望可以大小寫不敏感,結(jié)果沒有成功,有興趣的可以參考這篇文章嘗試一下(自定義Sybase排序方式)。
我使用的是Language:chinese / Character:eucgb / Sort:binary,結(jié)果在轉(zhuǎn)換代碼的時候把hibernate中的所有配置文件涉及到表名/字段名的地方全部改成了大寫,還好是用hibernate,改動的地方不是很多(sybase的驅(qū)動可以在sybase安裝目錄下的\jConnect-5_5\classes\jconn2.jar和jConnect-6_0\classes\jconn3.jar找到)。
轉(zhuǎn)換代碼的時候遇到兩個問題,一是對于下面這樣的語句運行會報錯
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 ')'.
后來發(fā)現(xiàn)把別名
companyId
去掉就可以正常運行了,嘗試了一下,發(fā)現(xiàn)sybase也是支持別名的,不知道是什么原因。
二是對于
select
USERID
from
TITAN_USER
user_
where
user_
.
USERID
=
1
這樣的語句,在oracle中運行是好的,轉(zhuǎn)化為sybase時,
會報錯:Implicit conversion from datatype 'VARCHAR' to 'INT' is not allowed.
必須變?yōu)?span lang="EN-US">
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.
的設(shè)置
后來因為項目需要不得已采用這種配置,發(fā)現(xiàn)關(guān)于字符編碼的問題只需要在數(shù)據(jù)庫連接時采用jdbc.url=jdbc:sybase:Tds:192.168.155.151:5000/oaframeset?charset=cp936這樣的設(shè)置就可以了,而所有頁面均聲明為
<%@ page pageEncoding="GBK" contentType="text/html; charset=GBK" %>
,
web.xml
中過濾器CharacterEncodingFilter設(shè)置為
<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這樣的配置發(fā)現(xiàn)無效,從sybase中讀出的數(shù)據(jù)在頁面上依然顯示亂碼,必須使用charset=cp936。
EUCGB
:GB2312-80編碼(即GB2312)
CP936
:GB13000-90編碼(即GBK)
GB18030 :GB18030-2000編碼
?注:對于oracle中BLOB/CLOB字段(BLOB主要存儲二進制字節(jié)流如附件,CLOB存儲大容量字符文本,如一篇新聞的內(nèi)容)在sybase中相應(yīng)的情況如下:
oracle | sybase | |
數(shù)據(jù)庫類型 | 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執(zhí)行可視化工具SQL Advantage,比較小,功能也比較簡單,不過使用起來比較方便。
sql
執(zhí)行也可以使用命令行工具isql來進行:
1
.連接:isql -U[Username] -P[Password]。
??
如:isql -
??
用戶名:sa 密碼:sasasa
2
.isql使用:寫完SQL語句后回車,輸入go ,然后回車,即可執(zhí)行相關(guān)SQL語句(執(zhí)行sql語句之前,可以用use dbname命令然后輸入go先進入相關(guān)的數(shù)據(jù)庫)
有關(guān)sybase的問題可以到它的中文討論區(qū)看看,Adaptive Server Enterprise中文技術(shù)討論區(qū)
http://www.sybase.com.cn/gvswse/site/china/support_services/newsgroup.jsp
在Sybase安裝后使用中出現(xiàn)了兩個錯誤:
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數(shù)據(jù)庫空間比較小造成的,所以最好在安裝sybase數(shù)據(jù)庫完畢后立刻更改它的Database Devices大小和master數(shù)據(jù)庫空間大小,設(shè)置多少自己把握。
在設(shè)置前最好備份一下master數(shù)據(jù)庫:
dump database master to 'D:\sybase\backup\master.dump'
版權(quán)所有:(xiaodaoxiaodao)藍小刀
??
xiaodaoxiaodao@gmail.com
?
沒用工具手動容易出錯。。
不好意思,對數(shù)據(jù)庫互導(dǎo)這一塊不是很熟悉,不知道什么地方可以下載到相關(guān)的中間件,能不能提供一兩個網(wǎng)址~~