真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

甲骨文怎么轉(zhuǎn)mysql 轉(zhuǎn)用甲骨文怎么寫

如何將oracle數(shù)據(jù)庫(kù)轉(zhuǎn)換成mysql數(shù)據(jù)庫(kù),現(xiàn)在公司有急用,方法可用的話再加分!

講解Oracle數(shù)據(jù)庫(kù)移植到MySQL

創(chuàng)新互聯(lián)是一家專業(yè)提供扎囊企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為扎囊眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

出處:IT專家網(wǎng) 日期:2010-06-24

一、前言

公司原來(lái)的項(xiàng)目是基于Oracle數(shù)據(jù)庫(kù)的,Oracle功能強(qiáng)大,但是部署和管理較復(fù)雜,更重要的是,購(gòu)買Oracle的費(fèi)用不是每個(gè)客戶都愿意承擔(dān)的。因此,迫切需要把公司項(xiàng)目所用數(shù)據(jù)庫(kù)移植到一個(gè)簡(jiǎn)單好用的數(shù)據(jù)庫(kù)上。當(dāng)然,如您所料,我們選擇了廣受歡迎的MySQL。

作為一個(gè)開源數(shù)據(jù)庫(kù),MySQL用無(wú)數(shù)案例證明了她的可用性,因此讓我們把重點(diǎn)放在如何將Oracle移植到MySQL上。已經(jīng)有很多的文章和專題介紹了Oracle移植到MySQL的方法和步驟,也有相當(dāng)多的工具可以輔助這種移植過(guò)程。但是,由于數(shù)據(jù)庫(kù)實(shí)現(xiàn)的差異,完美的移植工具是不存在的,移植過(guò)程中不斷碰到的問(wèn)題證明了這一點(diǎn),特別是您使用了Oracle的一些高級(jí)特性時(shí)。

從Oracle移植到MySQL主要有六個(gè)方面的內(nèi)容需要移植,一是表Table,包括表結(jié)構(gòu)和數(shù)據(jù),二是觸發(fā)器Trigger,三是存儲(chǔ)過(guò)程Procedure,函數(shù)function和包Package,四是任務(wù)Job,五是用戶等其他方面的移植,六是具體應(yīng)用程序通過(guò)SQL語(yǔ)句訪問(wèn)時(shí)的細(xì)節(jié)差異克服。

筆者用來(lái)移植測(cè)試的數(shù)據(jù)庫(kù)是:Oracle 9i ,MySQL 6.0,Windows 2000環(huán)境。

二、表的移植

這個(gè)部分的移植是最容易用工具實(shí)現(xiàn)的部分,因?yàn)楹芏郙ySQL的圖形管理工具都自帶這樣的移植工具,比如SQLYog,MySQL Administrator等。但是,這些工具的移植能力各有不同,對(duì)字段類型轉(zhuǎn)換、字符集等問(wèn)題都有自己的處理方式,使用時(shí)請(qǐng)注意。

筆者使用“SQLYog Migration Toolkit”工具按提示步驟移植后,表的主要結(jié)構(gòu)和數(shù)據(jù)將成功移植,主要包括表的字段類型(經(jīng)過(guò)映射轉(zhuǎn)換,比如number會(huì)轉(zhuǎn)換為double,date轉(zhuǎn)換為timestamp等,請(qǐng)小心處理日期字段的默認(rèn)值等),表的主鍵,表的索引(Oracle的位圖索引會(huì)被轉(zhuǎn)成BTree索引,另外表和字段的注釋會(huì)丟失)等信息。需要特別注意的是,Oracle的自增字段的處理。

大家知道,Oracle通常使用序列sequence配合觸發(fā)器實(shí)現(xiàn)自增字段,但是MySQL和SQL Server等一樣,不提供序列,而直接提供字段自增屬性。所以,請(qǐng)把Oracle里面的自增字段實(shí)現(xiàn)直接改為MySQL的字段屬性,而且,這個(gè)字段必須是主鍵(key)并且不能有默認(rèn)值。

還有一個(gè)問(wèn)題,如果您的應(yīng)用要直接使用Oracle的某個(gè)序列,那么您只能在MySQL里面模擬實(shí)現(xiàn)一個(gè),具體方法就是利用MySQL的自增字段實(shí)現(xiàn)的。

三、觸發(fā)器的移植

首先,MySQL在6.0以后才支持觸發(fā)器!

觸發(fā)器的移植沒(méi)有現(xiàn)成工具,因?yàn)閮烧咧g的語(yǔ)法差異較大,您只能通過(guò)手工對(duì)照著原來(lái)的邏輯一個(gè)一個(gè)添加。

這里要說(shuō)明一下,MySQL的SQL過(guò)程語(yǔ)法和Oracle PL/SQL大致相同,但還是有些細(xì)微差別:

1. 變量聲明Declare部分,在Oracle中Declare語(yǔ)句位于Begin之前,在MySQl中,Declare位于Begin之后;

2. 注釋不同,在Oracle中,可用 “—“ 注釋一行或“/* */”注釋一段,在MySQL中,需用 “/* */”或“#”來(lái)注釋

3. 對(duì)觸發(fā)前后變量值的引用方法不同;在Oracle中,用 :new.eid, :old.eid表示新舊值,

在MySQL中,用 New.eid,old.eid表示新舊值

4. 移植中發(fā)現(xiàn)的問(wèn)題

1) Oracle的自治事務(wù)autonomous_transaction ,MySQL不支持,您必須用其他方式實(shí)現(xiàn),MySQL不允許在觸發(fā)器過(guò)程中執(zhí)行對(duì)觸發(fā)器所在表的操作(包括讀寫)

2) MySQL函數(shù)和trigger中不能執(zhí)行動(dòng)態(tài)SQL語(yǔ)句,也就是說(shuō),您不能在觸發(fā)器里面組合出來(lái)一個(gè)SQL字符串,然后用exec來(lái)執(zhí)行

3) Oracle的表級(jí)觸發(fā)器,MySQL還不支持,所以必須改成使用行級(jí)觸發(fā)器,注意這會(huì)導(dǎo)致有時(shí)SQL語(yǔ)句的執(zhí)行效率很低

四、存儲(chǔ)過(guò)程,函數(shù)和程序包的移植

程序包是Oracle用來(lái)組織邏輯功能的一個(gè)Object,MySQL不支持,因此需要將包里的存儲(chǔ)過(guò)程、函數(shù)等全部放到該數(shù)據(jù)庫(kù)公有過(guò)程和函數(shù)里面。

MySQL的過(guò)程和函數(shù)語(yǔ)法與Oracle類似,但還是有細(xì)微差別,除了數(shù)據(jù)類型需要轉(zhuǎn)換,還有:

1. 格式不同,例如:

Oracle為:

CREATE OR REPLACE procedure procedure1(TableName in varchar2) is

MySQL應(yīng)該為:

CREATE procedure procedure1( in TableName varchar(200))

2. 賦值語(yǔ)句不同:

Oracle賦值語(yǔ)句為:

strSQL := ‘update table set field1=1’;

MySQL應(yīng)該為:

Set StrSQL = ‘update table set field1=1’;(用:=也行)

3. 一些要用到游標(biāo)的過(guò)程請(qǐng)注意

MySQL過(guò)程不支持嵌套游標(biāo),不支持帶參游標(biāo),不支持記錄類型%ROWTYPE,不支持?jǐn)?shù)組等,原Oracle用到這些的必須改寫

五、Job的移植

Job是Oracle的定時(shí)任務(wù)實(shí)現(xiàn)的方法,MySQL6中用Event實(shí)現(xiàn),具體語(yǔ)法請(qǐng)參考MySQL手冊(cè)。

在MySQL中使用event請(qǐng)注意,默認(rèn)它是不運(yùn)行的,您可以

1) 保證MySQL定時(shí)任務(wù)event scheduler運(yùn)行,需要MySql 5.1.6以上,并且在啟動(dòng)后執(zhí)行SET GLOBAL event_scheduler = ON;(也可以在初始配置文件比如my.ini中加入event_scheduler = ON的參數(shù))

2) 啟用event功能后,每次執(zhí)行會(huì)往MySQL的錯(cuò)誤日志文件寫一些信息(data目錄下的“主機(jī)名.err”文件),導(dǎo)致這個(gè)文件越來(lái)越大(除非經(jīng)常做flush log操作)。所以,如果您的event執(zhí)行很頻繁,可在my.ini中加參數(shù)console=TRUE,這樣執(zhí)行event的信息就不會(huì)寫進(jìn)來(lái)了

六、用戶的移植

Oracle的用戶管理和MySQL下有較大區(qū)別,請(qǐng)分別建立用戶,并賦予合適的權(quán)限。

七、應(yīng)用程序的移植

由于語(yǔ)法細(xì)節(jié)上的差異,導(dǎo)致很多SQL語(yǔ)句需要改寫。筆者記下了所有移植過(guò)程中碰到的SQL語(yǔ)句細(xì)節(jié)差異,這些也是一般項(xiàng)目可能會(huì)用到的地方,雖然肯定不全,但也列出來(lái)以供參考:

1)Oracle的to_char函數(shù)不能再使用,換用如CONCAT(14.3)的形式,為了提高應(yīng)用程序兼容性,建議手工寫一個(gè)

2)Oracle的to_date函數(shù)不能再使用,建議手工寫一個(gè)添加到MySQL數(shù)據(jù)庫(kù)

3)Oracle的decode函數(shù)不能再使用,換用SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END 的形式

4)nvl這樣的一些專用函數(shù),MySQL是沒(méi)有的,可以把

select nvl(to_char(num),'nothing') from t_equipment轉(zhuǎn)換成

select case num when num then num else 'nothing' end from t_equipment

5)instr之類的函數(shù),函數(shù)名相同,但參數(shù)個(gè)數(shù)不同

6)Oracle的sysdate要寫成sysdate()的形式

7)包的形式已經(jīng)取消,所以原來(lái)以包的方式調(diào)用的過(guò)程如xx_pack.xxx要寫成xxx()

8)帶進(jìn)制字符轉(zhuǎn)數(shù)字

Oracle風(fēng)格:TO_NUMBER(strTmp,'XX') TO_NUMBER(’9’)

MySQL風(fēng)格:CONV(strTmp,16,10) CONV(’9’,10,10) 如果字符串前后有加減操作,會(huì)隱含轉(zhuǎn)換成數(shù)字

9) 不能再有直接調(diào)用序列的形式,如果一定需要,可以模擬實(shí)現(xiàn)一個(gè)

10)日期直接加減的含義不同了,比如Oracle中sysdate + 1 變成了sysdate() + interval 1 day(注意如果寫成sysdate() + 1 語(yǔ)法還是正確的,但含義是錯(cuò)誤的)

查詢select sysdate() + 1 from dual 在MySQL得到比如 20080223153234(= 20080223153233 + 1)的數(shù)

而在Oracle中會(huì)得到第二天當(dāng)前時(shí)刻。

11) MySQL單純的date類型只是日期不帶時(shí)間,DATETIME或TIMESTAMP帶有時(shí)間,用DATE_FORMAT函數(shù)可以控制顯示形式

12)select 'abc' || 'd' from dual 兩個(gè)數(shù)據(jù)執(zhí)行的結(jié)果不同(語(yǔ)法都能通過(guò)),MySQL要寫成select concat('abc' , 'd')的形式

13) Oracle高級(jí)功能,如帶有暗示索引的select語(yǔ)句,MySQL是不支持的(語(yǔ)法可以通過(guò))

14)有些MySQL的保留字不能直接用在SQL語(yǔ)句里,要加表名或別名限制,如select RIGHT FROM XX要改成select a.RIGHT FROM XX a

15) Oracle的子查詢可以不起別名,但MySQL是必須的,比如下面的別名aa:

select field1 from (select sysdate() as field1 from dual) as aa

16)很多系統(tǒng)表名都是不同的,比如,列出某個(gè)表的信息:

select * from tab where TName='T_TEST'改成

select table_name,table_type from information_schema.tables where table_schema = 'user' and table_name=' T_TEST '

17)MySQL下update時(shí)不能有本身的子查詢

update T_TEST set Flag = 0 where field1 in

(select distinct b.field1 from T_TEST b where b.flag=1)

18)Oracle下’’和null等價(jià),而MySQL則不然

select 1 from dual where '' is null在Oracle下可以取到記錄,在MySQL下不能

dual表的使用,substr、trim等函數(shù)的主要使用方式和Oracle類似

八、小結(jié)和建議

看起來(lái),Oracle移植到MySQL似乎挺麻煩,有沒(méi)有一鍵完成的簡(jiǎn)單辦法?呵呵,我沒(méi)有找到,除非您只使用基本表,只使用基本SQL語(yǔ)句訪問(wèn)它。當(dāng)然,建議大家初始設(shè)計(jì)的時(shí)侯,就考慮到多數(shù)據(jù)庫(kù)的支持,權(quán)衡一下使用一些高級(jí)功能帶來(lái)的好處和對(duì)可移植性方面帶來(lái)的損害,這會(huì)大大減少后期移植時(shí)面對(duì)的問(wèn)題;另外,在應(yīng)用架構(gòu)設(shè)計(jì)時(shí),也建議使用較好的框架去屏蔽這些差異,比如J2EE的Hibernate框架等。

感謝偉大的Oracle,給我們提供了很多的高級(jí)功能,有很多是MySQL沒(méi)有的,因此,在移植時(shí)你不得不放棄一些非必須的功能,比如,全表cache、物化視圖、函數(shù)索引等;如果該功能是必須的,您可能要使用別的方式來(lái)實(shí)現(xiàn),或者轉(zhuǎn)到應(yīng)用程序?qū)用鎭?lái)考慮。當(dāng)然,這些功能MySQL今天沒(méi)有,不代表明天也沒(méi)有,我們可以拭目以待。

由于開源軟件的原因,MySQL的bug或者缺陷有時(shí)還會(huì)干擾你,請(qǐng)仔細(xì)測(cè)試和優(yōu)化您的應(yīng)用程序,調(diào)整MySQL的配置參數(shù),確保它可以運(yùn)行得和Oracle下一樣好。

(責(zé)任編輯:王倩)

怎樣將Sqlserver數(shù)據(jù)庫(kù)轉(zhuǎn)成mysql數(shù)據(jù)庫(kù)

您好,很高興為您解答。\x0d\x0a\x0d\x0a1、MYSQL的工具使用navicat;\x0d\x0a2、SQL在安裝的時(shí)候,需要安裝SQL native Clent,并且開啟服務(wù);\x0d\x0a3、在navicat中創(chuàng)建數(shù)據(jù)連接,創(chuàng)建一個(gè)對(duì)應(yīng)的空數(shù)據(jù)庫(kù)\x0d\x0a4、創(chuàng)建數(shù)據(jù)庫(kù)后,打開數(shù)據(jù)庫(kù),選擇導(dǎo)入向?qū)x0d\x0a\x0d\x0a5、導(dǎo)入向?qū)Ю?,選擇ODBC\x0d\x0a\x0d\x0a6、點(diǎn)下一步,導(dǎo)入里面選擇sql native client;\x0d\x0a\x0d\x0a7、下一步,選擇使用windows NT 集成安全設(shè)置,數(shù)據(jù)庫(kù)選擇你要轉(zhuǎn)換的數(shù)據(jù)庫(kù),確定\x0d\x0a\x0d\x0a8、如表結(jié)構(gòu)完全一樣,那么就全選數(shù)據(jù)表吧,確定,因我們是新建的數(shù)據(jù)庫(kù),里面是空的,那么默認(rèn)是創(chuàng)建表,如果是要導(dǎo)入到已經(jīng)有的表結(jié)構(gòu)里,則在目標(biāo)表里選擇要導(dǎo)入的目標(biāo)表,然后選字段。注意在第6步的時(shí)候,選對(duì)表的主鍵進(jìn)行設(shè)置!\x0d\x0a\x0d\x0a9、如果是添加數(shù)據(jù),則選擇:添加記錄到目標(biāo)表;如果是需要ID值跟源數(shù)據(jù)庫(kù)一致,則選擇復(fù)制,刪除目標(biāo)全部數(shù)據(jù),并從源數(shù)據(jù)重新導(dǎo)入\x0d\x0a\x0d\x0a注意,導(dǎo)入的時(shí)候,如果是已存在表結(jié)構(gòu),則鍵位不能空,如果是添加數(shù)據(jù),則ID值空著,不要添加主鍵,在導(dǎo)入過(guò)程中如果出現(xiàn)錯(cuò)誤,則根據(jù)出錯(cuò)提示處理,此方法絕對(duì)可以!\x0d\x0a\x0d\x0a如若滿意,請(qǐng)點(diǎn)擊右側(cè)【采納答案】,如若還有問(wèn)題,請(qǐng)點(diǎn)擊【追問(wèn)】\x0d\x0a\x0d\x0a希望我的回答對(duì)您有所幫助,望采納!\x0d\x0a\x0d\x0a ~ O(∩_∩)O~

怎么把MDF數(shù)據(jù)轉(zhuǎn)到MySQL

用SQL語(yǔ)句實(shí)現(xiàn)就是

select *

into StudentManager

form cd.StudentManager

用數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出功能亦可,或者直接把數(shù)據(jù)庫(kù)的數(shù)據(jù)文件(*.mdf)和日志文件(*.ldf)都拷貝目標(biāo)數(shù)據(jù)庫(kù),然后在新數(shù)據(jù)庫(kù)中加載。


分享標(biāo)題:甲骨文怎么轉(zhuǎn)mysql 轉(zhuǎn)用甲骨文怎么寫
網(wǎng)址分享:http://weahome.cn/article/hpihgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部