最近做了些 數(shù)據(jù)庫 轉(zhuǎn)換工作,主要是從Sql Server轉(zhuǎn)換到 Oracle ,過程中遇到很多問題,現(xiàn)進(jìn)行一個小小總結(jié),方便有同樣需求的朋友們。 需要對數(shù)據(jù)庫結(jié)構(gòu)、數(shù)據(jù)、自定義函數(shù)、存儲過程等數(shù)據(jù)庫元素進(jìn)行轉(zhuǎn)換,由于Sql Server和Oracle數(shù)據(jù)庫語言本身的差異非常大,所以自定義函數(shù)和存儲過程的轉(zhuǎn)換是比較困難的一件事情,市面上也很少有這方面的 工具 ,幾乎都想直接寫 工具 了,后來卻找到了個國外的一個叫做“Swiss SQL - SQL Server To Oracle” 這樣的 工具 ,此 工具 可以在http://www./ 站點 上下載,使用方法有兩種,一種是轉(zhuǎn)換TSQL腳本到PLSQL,一種是通過JDBC連接到SQLServer數(shù)據(jù)庫進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換后的結(jié)果都保存為PLSQL腳本,要導(dǎo)入Oracle需要運行這些腳本。此軟件是用Java語言 編寫 在安裝之前必須先安裝JDK,在試用過程中發(fā)現(xiàn)此工具存在這么幾個問題: 1、此工具在轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)的過程中把varchar的數(shù)據(jù)類型都轉(zhuǎn)換成varchar2(1)了而不管原諒數(shù)據(jù)有多長統(tǒng)一都轉(zhuǎn)換成1個長度,我不知道這么簡單的BUG有沒有其他設(shè)置的地方,反正后來我們沒用它轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)也就沒怎么研究了。 2、此工具為試用版本,我們也沒找到注冊版,而試用版只能前后轉(zhuǎn)換共2000行SQL語句,而要購買這個軟件也不太實際,費用高不說,還是外國的買起來也麻煩,軟件為轉(zhuǎn)換這么幾個存儲過程去耗費這么大的資金在我們這些用盜版的人看來是不可取的,我們的數(shù)據(jù)庫對象那么多,顯然這是不好辦的問題,那么能否用欺騙的手法蒙混過關(guān)呢?下面就是具體的欺騙手法了: -記得以前用過一個軟件叫著“完美卸載”此軟件可以記錄安裝程序時對磁盤進(jìn)行的更改,有了這個我們就可以安裝軟件的時候記錄好此軟件對磁盤所寫入的文件,看看有什么異樣這樣我們就能理解共享軟件在那個文件寫入了注冊信息。 -通過跟蹤發(fā)現(xiàn)在安裝軟件的時候,安裝程序除了對安裝目錄寫入信息和少量的注冊表信息外沒有對磁盤做任何更改,別急,我們繼續(xù)跟蹤,跟蹤到第一次運行軟件的時候,就有了異樣,發(fā)現(xiàn)此軟件在Windows目錄下寫入了這個文件,趕忙備份此文件,轉(zhuǎn)換了幾行語句后,關(guān)閉軟件,果然此文件再次被修改,這就說明很有可能此文件就是記錄的軟件試用的行數(shù)。當(dāng)我們第二次使用的時候把備份的文件覆蓋了原文件,但此事軟件所有按鈕都禁用了,說明軟件還有其他的地方可以判斷 用戶 是否使用過軟件。重新安裝軟件(其實就是把安裝目錄里的文件重置一下),結(jié)果又可以使用2000行了。這就是軟件欺騙的全部過程,也是可當(dāng)作破解軟件的土辦法,只是麻煩一點的是需要先備份安裝目錄和那個dll文件,注意那個dll文件不能通用,必須要程序生成的本機的dll文件。當(dāng)快要用完試用行數(shù)的時候通過覆蓋文件的方式欺騙軟件,從而可以繼續(xù)試用,就這么簡單。 另外在轉(zhuǎn)換數(shù)據(jù)庫的過程中應(yīng)該還要注意以下幾個問題: -在Oracle數(shù)據(jù)庫中命名不能大于30個英文字符,無論是表名、存儲過程名等等,統(tǒng)統(tǒng)不能大于30個字符。 -在Oracle數(shù)據(jù)庫中,存儲過程的定義更俠義一些,而不像SqlServer那樣開放。特別像返回結(jié)果集這些操作上存在很多差異,在SQLServer可以直接試用select語句返回結(jié)果集,而Oracle只能把存儲過程封裝到包中設(shè)置Out參數(shù)的Cursor數(shù)據(jù)類型來達(dá)到返回結(jié)果集的目的,在存儲過程內(nèi)部不能直接試用Select語句返回結(jié)果集,很是不便。 -在使用單純的SQL語句的時候,如果是多條語句,調(diào)用Oracle數(shù)據(jù)庫就必須封裝在begin/end語句塊中。 -手動對Oracle數(shù)據(jù)庫查詢時可以選用PL/SQL Developer這個工具,蠻好用的。 http://www.cn blog s.com/Dragonpro/archive/2005/11/16/277473. html 將SQL Server2005中的數(shù)據(jù)同步到Oracle中時間:2007-12-10 11:11:15來源:站長資訊收集整理作者: 有時由于項目開發(fā)的需要,必須將SQLServer2005中的某些表同步到Oracle數(shù)據(jù)庫中,由其他系統(tǒng)來讀取這些數(shù)據(jù)。不同數(shù)據(jù)庫類型之間的數(shù)據(jù)同步我們可以使用鏈接服務(wù)器和SQLAgent來實現(xiàn)。假設(shè)我們這邊(SQLServer2005)有一個合同管理系統(tǒng),其中有表contract 和contract_project是需要同步到一個MIS系統(tǒng)中的(Oracle9i)那么,我們可以按照以下幾步實現(xiàn)數(shù)據(jù)庫的同步。 1.在Oracle中建立對應(yīng)的contract 和 contract_project表,需要同步哪些字段我們就建那些字段到Oracle表中。 這里需要注意的是Oracle的數(shù)據(jù)類型和SQLServer的數(shù)據(jù)類型是不一樣的,那么他們之間是什么樣的關(guān)系拉?我們可以在SQLServer下運行: SELECT * FROM msdb.dbo.MSdatatype_mappings SELECT * FROM msdb.dbo.sysdatatypemappings 來查看SQLServer和其他數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)類型對應(yīng)關(guān)系。第一個SQL語句是看SQL轉(zhuǎn)Oracle的類型對應(yīng),而第二個表則更詳細(xì)得顯示了各個數(shù)據(jù)庫系統(tǒng)的類型對應(yīng)。根據(jù)第一個表和我們的SQLServer中的字段類型我們就可以建立好Oracle表了?!?/span> 以下是引用片段: ORACLEbigintNUMBER1931 ORACLEbinaryBLOBNULL01 ORACLEbinaryRAW-141 ORACLEbitNUMBER131 ORACLEcharCHAR-141 ORACLEcharCLOBNULL01 ORACLEcharVARCHAR2-141 ORACLEdatetimeDATENULL01 ORACLEdecimalNUMBER-131 ORACLEdouble precisionFLOATNULL01 ORACLEfloatFLOATNULL01 ORACLEimageBLOBNULL01 ORACLEintNUMBER1031 ORACLEmoneyNUMBER1931 ORACLEncharNCHAR-141 ORACLEncharNCLOBNULL01 ORACLEntextNCLOBNULL01 ORACLEnumericNUMBER-131 ORACLEnvarcharNCLOBNULL01 ORACLEnvarcharNVARCHAR2-141 ORACLEnvarchar(max)NCLOBNULL01 ORACLErealREALNULL01 ORACLEsmalldatetimeDATENULL01 ORACLEsmallintNUMBER531 ORACLEsmallmoneyNUMBER1031 ORACLEsysnameNVARCHAR212841 ORACLEtextCLOBNULL01 ORACLEtimestampRAW841 ORACLEtinyintNUMBER331 ORACLEuniqueidentifierCHAR3841 ORACLEvarbinaryBLOBNULL01 ORACLEvarbinaryRAW-141 ORACLEvarbinary(max)BLOBNULL01 ORACLEvarcharCLOBNULL01 ORACLEvarcharVARCHAR2-141 ORACLEvarchar(max)CLOBNULL01 ORACLExmlNCLOBNULL01 ORACLEbigintNUMBER1931 ORACLEbinaryBLOBNULL01 ORACLEbinaryRAW-141 ORACLEbitNUMBER131 ORACLEcharCHAR-141 ORACLEcharCLOBNULL01 ORACLEcharVARCHAR2-141 ORACLEdatetimeDATENULL01 ORACLEdecimalNUMBER-131 ORACLEdouble precisionFLOATNULL01 ORACLEfloatFLOATNULL01 ORACLEimageBLOBNULL01 ORACLEintNUMBER1031 ORACLEmoneyNUMBER1931 ORACLEncharCHAR-141 ORACLEncharCLOBNULL01 ORACLEntextCLOBNULL01 ORACLEnumericNUMBER-131 ORACLEnvarcharCLOBNULL01 ORACLEnvarcharVARCHAR2-141 ORACLEnvarchar(max)CLOBNULL01 ORACLErealREALNULL01 ORACLEsmalldatetimeDATENULL01 ORACLEsmallintNUMBER531 ORACLEsmallmoneyNUMBER1031 ORACLEsysnameVARCHAR212841 ORACLEtextCLOBNULL01 ORACLEtimestampRAW841 ORACLEtinyintNUMBER331 ORACLEuniqueidentifierCHAR3841 ORACLEvarbinaryBLOBNULL01 ORACLEvarbinaryRAW-141 ORACLEvarbinary(max)BLOBNULL01 ORACLEvarcharCLOBNULL01 ORACLEvarcharVARCHAR2-141 ORACLEvarchar(max)CLOBNULL01 ORACLExmlCLOBNULL01 ORACLEbigintNUMBER1931 ORACLEbinaryBLOBNULL01 ORACLEbinaryRAW-141 ORACLEbitNUMBER131 ORACLEcharCHAR-141 ORACLEcharCLOBNULL01 ORACLEcharVARCHAR2-141 ORACLEdatetimeDATENULL01 ORACLEdecimalNUMBER-131 ORACLEdouble precisionFLOATNULL01 ORACLEfloatFLOATNULL01 ORACLEimageBLOBNULL01 ORACLEintNUMBER1031 ORACLEmoneyNUMBER1931 ORACLEncharNCHAR-141 ORACLEncharNCLOBNULL01 ORACLEntextNCLOBNULL01 ORACLEnumericNUMBER-131 ORACLEnvarcharNCLOBNULL01 ORACLEnvarcharNVARCHAR2-141 ORACLEnvarchar(max)NCLOBNULL01 ORACLErealREALNULL01 ORACLEsmalldatetimeDATENULL01 ORACLEsmallintNUMBER531 ORACLEsmallmoneyNUMBER1031 ORACLEsysnameNVARCHAR212841 ORACLEtextCLOBNULL01 ORACLEtimestampRAW841 ORACLEtinyintNUMBER331 ORACLEuniqueidentifierCHAR3841 ORACLEvarbinaryBLOBNULL 01 ORACLEvarbinaryRAW-141 ORACLEvarbinary(max)BLOBNULL01 ORACLEvarcharCLOBNULL01 ORACLEvarcharVARCHAR2-141 ORACLEvarchar(max)CLOBNULL01 ORACLExmlNCLOBNULL01 2.建立鏈接服務(wù)器。我們將Oracle系統(tǒng)作為SQLServer的鏈接服務(wù)器加入到SQLServer中。 具體做法參見我以前的文章http://www.cnblogs.com/studyzy/archive/2006/12/08/690307.html 3.使用SQL語句通過鏈接服務(wù)器將SQLServer數(shù)據(jù)寫入Oracle中。 比如我們建立了鏈接服務(wù)器MIS,而Oracle中在MIS用戶下面建立了表contract_project,那么我們的SQL語句就是: 以下是引用片段: DELETE FROM MIS..MIS.CONTRACT_PROJECT --清空Oracle表中的數(shù)據(jù) INSERT into MIS..MIS.CONTRACT_PROJECT--將SQLServer中的數(shù)據(jù)寫到Oracle中 SELECTcontract_id,project_code,actual_money FROM contract_project 如果報告成功,那么我們的數(shù)據(jù)就已經(jīng)寫入到Oracle中了。用 以下是引用片段: SELECT * FROM MIS..MIS.CONTRACT_PROJECT 查看Oracle數(shù)據(jù)庫中是否已經(jīng)有數(shù)據(jù)了。 4.建立SQLAgent,將以上同步SQL語句作為執(zhí)行語句,每天定時同步兩次。 這樣我們的同步就完成了。 這里需要注意的是MIS..MIS.CONTRACT_PROJECT這里必須要大寫,如果是小寫的話會造成同步失敗。 |
|