從SQL Server數(shù)據(jù)庫(kù)轉(zhuǎn)到Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)腳本處理

在我們很多情況下的開(kāi)發(fā),為了方便或者通用性的考慮兜粘,都首先考慮SQL Server數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā)污朽,但有時(shí)候客戶(hù)的生產(chǎn)環(huán)境是Oracle或者其他數(shù)據(jù)庫(kù)髓介,那么我們就需要把對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)腳本轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)庫(kù),數(shù)據(jù)結(jié)構(gòu)一般來(lái)說(shuō)箱硕,語(yǔ)法都遵循了SQL92的標(biāo)準(zhǔn)拴竹,或者我們根據(jù)不同的PowerDesigner文件進(jìn)行生成對(duì)應(yīng)的結(jié)構(gòu)腳本即可,但是實(shí)際數(shù)據(jù)的腳本我們就需要進(jìn)行一定的處理剧罩,以及文本的替換處理了栓拜,本文結(jié)合Notepad++的文本正則表達(dá)式替換,實(shí)現(xiàn)一些如日期較為特殊的數(shù)據(jù)腳本調(diào)整惠昔,把它從SQL Server轉(zhuǎn)換為Oracle的處理過(guò)程幕与,本文就是針對(duì)這些整體的數(shù)據(jù)庫(kù)處理進(jìn)行介紹。

1镇防、數(shù)據(jù)庫(kù)設(shè)計(jì)文件及數(shù)據(jù)庫(kù)結(jié)構(gòu)腳本

我們一般在做數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候啦鸣,都會(huì)使用PowerDesigner這樣的數(shù)據(jù)庫(kù)建模工具進(jìn)行設(shè)計(jì),默認(rèn)把它設(shè)計(jì)為SQL Server的數(shù)據(jù)庫(kù)設(shè)計(jì)模型来氧,如下所示诫给。



當(dāng)然我們?nèi)绻枰渌麛?shù)據(jù)庫(kù),那么把它轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)庫(kù)啦扬,然后進(jìn)行一定的數(shù)據(jù)庫(kù)類(lèi)型調(diào)整中狂,以及字段的大小寫(xiě)轉(zhuǎn)換即可。



根據(jù)這種方式我們調(diào)整后的各種數(shù)據(jù)庫(kù)設(shè)計(jì)文件如下所示扑毡。

不同的數(shù)據(jù)庫(kù)的設(shè)計(jì)模型有所差異胃榕,那么我們進(jìn)行一些核對(duì),主要是數(shù)據(jù)庫(kù)類(lèi)型的核對(duì)即可僚楞,如備注字段的大文本應(yīng)該設(shè)置為CLOB勤晚,二進(jìn)制的應(yīng)該調(diào)整為BLOB等。
例如對(duì)于Oracle的數(shù)據(jù)庫(kù)設(shè)計(jì)(從SQL Server轉(zhuǎn)換過(guò)來(lái)的)泉褐,同時(shí)也需要把它的字段名轉(zhuǎn)換為大寫(xiě)才好赐写,在PowerDesigner里面可以執(zhí)行自定義函數(shù)進(jìn)行處理。



其中在對(duì)話框選擇打開(kāi)對(duì)應(yīng)的大寫(xiě)字段表名的腳本膜赃,如下操作挺邀。

為了大家方便使用,我把它貼出來(lái),供使用端铛。
'文件:powerdesigner.ucase.VBs
'版本:1.0
'功能:遍歷物理模型中的所有表泣矛,將表名、表代碼禾蚕、字段名您朽、字段代碼全部由小寫(xiě)改成大寫(xiě);
' 并將序列的名和代碼由小寫(xiě)改成大寫(xiě)换淆。
'用法:打開(kāi)物理模型哗总,運(yùn)行本腳本(Ctrl+Shift+X)
'備注:
'*****************************************************************************
dim model 'current model
set model = ActiveModel

If (model Is Nothing) Then
MsgBox "There is no current Model"
ElseIf Not model.IsKindOf(PdPDM.cls_Model) Then
MsgBox "The current model is not an Physical Data model."
Else
ProcessTables model
ProcessSequences model
End If

'*****************************************************************************
'函數(shù):ProcessSequences
'功能:遞歸遍歷所有的序列
'*****************************************************************************
sub ProcessSequences(folder)
'處理模型中的序列:小寫(xiě)改大寫(xiě)
dim sequence
for each sequence in folder.sequences
sequence.name = UCase(sequence.name)
sequence.code = UCase(sequence.code)
next
end sub

'*****************************************************************************
'函數(shù):ProcessTables
'功能:遞歸遍歷所有的表
'*****************************************************************************
sub ProcessTables(folder)
'處理模型中的表
dim table
for each table in folder.tables
if not table.IsShortCut then 
ProcessTable table
end if
next
'對(duì)子目錄進(jìn)行遞歸
dim subFolder
for each subFolder in folder.Packages
ProcessTables subFolder
next 
end sub

'*****************************************************************************
'函數(shù):ProcessTable
'功能:遍歷指定table的所有字段,將字段名由小寫(xiě)改成大寫(xiě)倍试,
' 字段代碼由小寫(xiě)改成大寫(xiě)
' 表名由小寫(xiě)改成大寫(xiě) 
'*****************************************************************************
sub ProcessTable(table)
dim col
for each col in table.Columns
'將字段名由小寫(xiě)改成大寫(xiě)
col.code = UCase(col.code)
col.name = UCase(col.name)
next 
table.name = UCase(table.name)
table.code = UCase(table.code)
end sub

這樣處理后讯屈,我們?cè)赑owerDesigner里面的表名及字段就可以正常轉(zhuǎn)換為大寫(xiě)了,從而可以獲得對(duì)應(yīng)表的數(shù)據(jù)結(jié)構(gòu)腳本县习,如果需要多個(gè)表涮母,那么可以批量生成數(shù)據(jù)庫(kù)結(jié)構(gòu)腳本。


2躁愿、數(shù)據(jù)庫(kù)表數(shù)據(jù)腳本的生成

上面的數(shù)據(jù)庫(kù)表結(jié)構(gòu)的腳本生成叛本,只是我們數(shù)據(jù)庫(kù)遷移腳本的一部分操作,有時(shí)候我們實(shí)際的框架或者業(yè)務(wù)系統(tǒng)里面彤钟,都往往有一些基礎(chǔ)數(shù)據(jù)需要寫(xiě)入的炮赦,那么就需要我們構(gòu)建對(duì)應(yīng)的數(shù)據(jù)腳本了。
在數(shù)據(jù)庫(kù)腳本導(dǎo)出的样勃,我們可以使用很多工具吠勘,如SQL Server本身的工具就可以導(dǎo)出數(shù)據(jù)的SQL腳本,同時(shí)我們也可以利用其它數(shù)據(jù)庫(kù)管理工具峡眶,如Toad For SQLServer或者Navicat Premium等數(shù)據(jù)庫(kù)管理工具實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)出腳本操作剧防。



然后在生成腳本的過(guò)程中,設(shè)置輸出的高級(jí)選項(xiàng)中的“要編寫(xiě)腳本的數(shù)據(jù)的類(lèi)型”為【僅限數(shù)據(jù)】即可辫樱,如下所示峭拘。



不過(guò)默認(rèn)采用SQLServer生成出來(lái)的數(shù)據(jù)腳本,對(duì)日期類(lèi)型轉(zhuǎn)換真不是很好狮暑,如下結(jié)果所示鸡挠。

因此我使用更加直觀顯示的Navicat Premium 工具來(lái)處理數(shù)據(jù)庫(kù)的數(shù)據(jù)腳本。使用Navicat Premium生成的腳本如下所示(僅僅日期類(lèi)型有所不同)搬男。

獲得生成的數(shù)據(jù)腳本如下所示拣展。



剩下的工作就是我們對(duì)這些數(shù)據(jù)腳本進(jìn)行進(jìn)一步的處理操作了。

3缔逛、數(shù)據(jù)表的數(shù)據(jù)腳本的替換處理

上面介紹了通過(guò)工具來(lái)獲得正確的數(shù)據(jù)腳本备埃,我們使用了Navicat Premium或者 Toad For SQLServer都能夠獲得類(lèi)似下面格式的時(shí)間腳本姓惑。
** N'2016-06-22 10:35:36.590'**
這樣我們?yōu)榱颂幚頌镺racle的日期數(shù)據(jù),那么需要轉(zhuǎn)換為
to_date('2016-06-22 10:35:36','yyyy-MM-dd HH24:mi:ss')
這樣的格式
那么我們對(duì)上面的腳本按脚,進(jìn)行一定規(guī)則的處理于毙,如替換:[dbo]. [ ] N'為' 等常規(guī)文本處理后,還需要再進(jìn)行正則表達(dá)式規(guī)則的處理才可以辅搬,例如我們的日期替換的正則表達(dá)式如下:
'(\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2}).\d{3}'to_date('\1','yyyy-MM-dd HH24:mi:ss')
如下所示唯沮。


最后使用正則表達(dá)式替換后的數(shù)據(jù)庫(kù)腳本如下所示。

4堪遂、數(shù)據(jù)腳本在PL-SQL Developer工具上執(zhí)行操作

上面介紹如何實(shí)現(xiàn)了表數(shù)據(jù)的腳本生成烂翰,有了這些腳本,我們需要使用Oracle的數(shù)據(jù)庫(kù)管理工具 PL-SQL Developer工具進(jìn)行數(shù)據(jù)導(dǎo)入蚤氏,才能最終完成整個(gè)過(guò)程。這個(gè)操作也是有所講究的踊兜。
例如我們創(chuàng)建各類(lèi)不同的數(shù)據(jù)庫(kù)腳本竿滨,那么只需要按照順序加入或者選擇加入執(zhí)行數(shù)據(jù)庫(kù)腳本即可。



那么執(zhí)行這些SQL捏境,該如何操作呢于游,是不是直接拖動(dòng)到PL-SQL上就可以了?
當(dāng)然不是垫言,否則長(zhǎng)一點(diǎn)的數(shù)據(jù)庫(kù)腳本贰剥,就可能導(dǎo)致非常遲緩的執(zhí)行效率。
一般可以通過(guò)兩種方式筷频,一種是使用命令行的方式蚌成。



這種方式執(zhí)行速度非常快凛捏,比起直接在PL-SQL的SQL窗口上執(zhí)行更有效率担忧。
另外一種方式,就是可以利用PL-SQL里面的另外一個(gè)地方進(jìn)行執(zhí)行數(shù)據(jù)庫(kù)腳本坯癣,如下所示瓶盛。
在【 工具】【導(dǎo)入表】的操作里面,彈出一個(gè)對(duì)話框示罗,也是執(zhí)行腳本高效的操作之一惩猫。


上面介紹的這些方式,就是在數(shù)據(jù)庫(kù)沒(méi)有的情況下蚜点,根據(jù)數(shù)據(jù)庫(kù)腳本構(gòu)建對(duì)應(yīng)的數(shù)據(jù)對(duì)象和數(shù)據(jù)的轧房。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绍绘,隨后出現(xiàn)的幾起案子锯厢,更是在濱河造成了極大的恐慌皮官,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实辑,死亡現(xiàn)場(chǎng)離奇詭異捺氢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剪撬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)摄乒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人残黑,你說(shuō)我怎么就攤上這事馍佑。” “怎么了梨水?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵拭荤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我疫诽,道長(zhǎng)舅世,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任奇徒,我火速辦了婚禮雏亚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摩钙。我一直安慰自己罢低,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布胖笛。 她就那樣靜靜地躺著网持,像睡著了一般。 火紅的嫁衣襯著肌膚如雪长踊。 梳的紋絲不亂的頭發(fā)上翎碑,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音之斯,去河邊找鬼日杈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佑刷,可吹牛的內(nèi)容都是我干的莉擒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瘫絮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涨冀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起麦萤,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹿鳖,失蹤者是張志新(化名)和其女友劉穎扁眯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翅帜,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姻檀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涝滴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绣版。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歼疮,靈堂內(nèi)的尸體忽然破棺而出杂抽,到底是詐尸還是另有隱情,我是刑警寧澤韩脏,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布缩麸,位于F島的核電站,受9級(jí)特大地震影響赡矢,放射性物質(zhì)發(fā)生泄漏杭朱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一济竹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霎槐,春花似錦送浊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至闭树,卻和暖如春耸棒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背报辱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工与殃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碍现。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓幅疼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昼接。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爽篷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容