第一步:創(chuàng)建腳本文件。
創(chuàng)新互聯(lián)一直通過(guò)網(wǎng)站建設(shè)和網(wǎng)站營(yíng)銷(xiāo)幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、移動(dòng)互聯(lián)產(chǎn)品、成都全網(wǎng)營(yíng)銷(xiāo)推廣服務(wù)為核心業(yè)務(wù)。十年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開(kāi)發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。
在Oracle數(shù)據(jù)庫(kù)重,創(chuàng)建腳本文件的方式很多。如可以直接在記事本中創(chuàng)建腳本文件,也可以通過(guò)SQL*Plus工具直接創(chuàng)建。不過(guò),筆者的意見(jiàn)是,在SQL*Plus中直接創(chuàng)建腳本文件的話,比較麻煩。這主要是因?yàn)樵赟QL*Plus工具中,命令編輯能力非常有效。如不能夠使用鍵盤(pán)上的箭頭鍵定位輸入的位置,不能夠使用DEL鍵刪除輸入的內(nèi)容等等。而且閱讀起來(lái)也比較困難。
第二步:編輯腳本文件。
在我們使用腳本文件的時(shí)候,往往需要根據(jù)實(shí)際情況,對(duì)其進(jìn)行稍微的調(diào)整。對(duì)腳本文件進(jìn)行編輯,也有兩種方式。一是通過(guò)SQL*Plus工具,二是第三方獨(dú)立的腳本編輯軟件。
對(duì)于一些調(diào)整不大的腳本文件,我們可以直接利用SQL*Plus工具打開(kāi),然后進(jìn)行編輯。但是,對(duì)于需要進(jìn)行大量修改的腳本文件,則筆者建議數(shù)據(jù)庫(kù)管理員采用第三方獨(dú)立的腳本編輯軟件。原因很簡(jiǎn)單,就如同上面所說(shuō)的那樣,SQL*Plus工具腳本命令編輯功能非常的薄弱。若采用這個(gè)工具對(duì)現(xiàn)成的腳本語(yǔ)句進(jìn)行編輯的話,則可能工作量還是重新編寫(xiě)一個(gè)來(lái)的輕。所以,數(shù)據(jù)庫(kù)管理員要根據(jù)實(shí)際的情況,選擇合適的腳本編輯工具。
另外,在編輯的過(guò)程中,要注意語(yǔ)法的正確性。特別是要注意,不能夠改變其固有的格式。如不要不小心刪除了最后的“/”符號(hào)結(jié)束。
第三步:運(yùn)行腳本文件。
腳本建立好之后,如何運(yùn)行腳本呢?在Oracle系統(tǒng)中也提供了許多方式。數(shù)據(jù)庫(kù)管理員可以根據(jù)自己的使用習(xí)慣來(lái)進(jìn)行選擇。
一是通過(guò)Start語(yǔ)句來(lái)調(diào)用腳本文件。其語(yǔ)法是Start Filemame[相關(guān)參數(shù)]。在運(yùn)行這個(gè)命令的時(shí)候,需要注意幾個(gè)問(wèn)題。
1、腳本文件的擴(kuò)展名問(wèn)題。上面在建立腳本文件的時(shí)候,筆者就跳掉過(guò),為了在SQL*Plus等工具中可以直接調(diào)用這個(gè)腳本文件,最好能夠把擴(kuò)展名改為Oracle數(shù)據(jù)庫(kù)能夠接受的擴(kuò)展名。默認(rèn)情況下,擴(kuò)展名設(shè)置為SQL即可。
2、腳本文件的路徑問(wèn)題。若用戶在利用Start調(diào)用腳本文件的時(shí)候,若沒(méi)有清楚的指名保存路徑的話,則SQL*Plus工具會(huì)現(xiàn)在當(dāng)前的目錄中進(jìn)行查找;若沒(méi)有的話,則會(huì)根據(jù)環(huán)境變量中確定的目錄中進(jìn)行查找。而一般情況下,我們把腳本文件都會(huì)獨(dú)立存放。所以,在使用Start命令執(zhí)行腳本文件的時(shí)候,最好能夠注明腳本文件的絕對(duì)路徑名。防止語(yǔ)句執(zhí)行錯(cuò)誤。
另外@命令也可以起到跟Start命令一樣的作用。只不過(guò),前者的使用范圍更廣一點(diǎn)。@命令可以脫離SQL*PLUS工具而使用。如可以直接在微軟操作系統(tǒng)中的命令行方式下使用。當(dāng)然,這操作系統(tǒng)要事先部署了Oracle數(shù)據(jù)庫(kù)環(huán)境。
二是可以直接利用SQL*Plus工具打開(kāi)文本文件,執(zhí)行腳本語(yǔ)句。然后點(diǎn)擊“文件”、“執(zhí)行”命令執(zhí)行這個(gè)腳本語(yǔ)句。這種方式的好處就是,系統(tǒng)會(huì)主動(dòng)提示用戶需要輸入的參數(shù)。
總之,腳本文件是我們管理Oracle數(shù)據(jù)庫(kù)的一大利器。我們好好利用腳本文件,可以提高Oracle數(shù)據(jù)庫(kù)的管理效率。畢竟,每次在需要的時(shí)候,都去編寫(xiě)命令是一件很麻煩的事情。而腳本文件的最大好處,就是可以提高語(yǔ)句的重復(fù)利用,節(jié)省我們編寫(xiě)語(yǔ)句、調(diào)試測(cè)試的時(shí)間。
這個(gè)commit應(yīng)該是本機(jī)的,和dblink沒(méi)什么關(guān)系,而且就算你找到的dblink的那個(gè)session那么也不行,以為這個(gè)session在dblink的操作完成后已經(jīng)關(guān)閉了。
個(gè)人感覺(jué)不要這么遠(yuǎn)程insert,最好是調(diào)用一個(gè)那個(gè)數(shù)據(jù)庫(kù)上的過(guò)程去insert這樣的話,在那個(gè)過(guò)程中commit肯定是沒(méi)有問(wèn)題的。
如果必須要這么寫(xiě),那么可以加入一條insert和一條delete
就是上面是正常insert的語(yǔ)句。
下面有一條delete(這條刪除一個(gè)絕對(duì)不可能出現(xiàn)的一條試試)
按照你的說(shuō)法,第二個(gè)事務(wù)提交時(shí),第一個(gè)事務(wù)才能commit??墒沁@樣會(huì)出現(xiàn)問(wèn)題,因?yàn)槿绻愦罅刻峤?,那么?shù)據(jù)庫(kù)會(huì)因此夯住的,所以你看看第一個(gè)辦法行不行,我覺(jué)得第一個(gè)辦法還靠譜點(diǎn)。
oracle的提交用commit,一般commit用語(yǔ)update語(yǔ)句及insert語(yǔ)句中。
如,有以下兩個(gè)語(yǔ)句:
update?test?set?id=3?where?id=2;
commit;
insert?into?test?values?(4,'王五');
commit;
如果進(jìn)行了update及insert操作后不進(jìn)行提交的話,那么修改或插入的數(shù)據(jù)只在當(dāng)前session有效,并不會(huì)寫(xiě)入數(shù)據(jù)庫(kù),只有當(dāng)commit(提交)后,才會(huì)生效。
為方便完成指定數(shù)據(jù)表的同步操作,可以采用dblink與merge結(jié)合的方法完成。
操作環(huán)境: 此數(shù)據(jù)庫(kù)服務(wù)器ip為192.168.196.76,有center與branch兩個(gè)庫(kù),一般需要將center的表數(shù)據(jù)同步到branch,center為源庫(kù),branch為目標(biāo)庫(kù),具體步驟如下:
1.在源庫(kù)創(chuàng)建到目標(biāo)庫(kù)的dblink
create database link branch???? --輸入所要?jiǎng)?chuàng)建dblink的名稱(chēng),自定義?? connect to dbuser identified by “password”? --設(shè)置連接遠(yuǎn)程數(shù)據(jù)庫(kù)的用戶名和密碼?? using '192.168.196.76/branch';? --指定目標(biāo)數(shù)據(jù)庫(kù)的連接方式,可用tns名稱(chēng)
在創(chuàng)建dblink時(shí),要注意,有時(shí)候可能會(huì)報(bào)用戶名和密碼錯(cuò)誤,但實(shí)際上我們所輸入的賬戶信息是正確的,此時(shí)就注意將密碼的大小寫(xiě)按服務(wù)器上所設(shè)置的輸入,并在賬號(hào)密碼前號(hào)加上雙引號(hào)(服務(wù)器版本不同造成的)。
2.成功后驗(yàn)證dblink
select * from tb_bd_action@branch; --查詢(xún)創(chuàng)建好的brach庫(kù)
正常情況下,如果創(chuàng)建dblink成功,可采用該方式訪問(wèn)到遠(yuǎn)程數(shù)據(jù)庫(kù)的表.
3.通過(guò)merge語(yǔ)句完成表數(shù)據(jù)同步
此例中需要將center庫(kù)中的tb_sys_sqlscripe表同步到branch,簡(jiǎn)單的語(yǔ)法如下:
merge into tb_sys_sqlscripe@branch b using tb_sys_sqlscripe c on (b.pk=c.pk)? --從center將表merge到branch,同步的依據(jù)是兩個(gè)表的pk
when matched then? update set b.sqlscripe=c.sqlscripe,b.author=c.author? --如果pk值是相同則將指定表的值更新到目標(biāo)表
when not matched then ? --如果pk值不一至,則將源表中的數(shù)據(jù)整條插入到目標(biāo)表中
insert values (c.pk, c.fk, c.createtime, c.lastmodifytime,c.author,c.module,c.deleteflag, c.scripttype);
commit;?????????????? --記得merge后必須commit,否則更改未能提交
4.為方便每次需要同步時(shí)自動(dòng)完成同步工作,可將該語(yǔ)句做成存儲(chǔ)過(guò)程或腳本來(lái)定時(shí)執(zhí)行或按要求手動(dòng)執(zhí)行,簡(jiǎn)單說(shuō)一下創(chuàng)建腳本的方法:
a.創(chuàng)建merge文件夾
b.先將merge語(yǔ)句寫(xiě)完整后,存到merge.sql文件中
c.新建merge.bat文件,編輯后寫(xiě)入以下內(nèi)容
sqlplus user/password@serverip/database @"%cd%\merge.sql"