文章詳情頁(yè)
SQL Server與Oracle鏈接服務(wù)器應(yīng)用
瀏覽:6日期:2023-11-15 18:22:03
;;;;最近要把.net開(kāi)發(fā)的CMS系統(tǒng)跟Java開(kāi)發(fā)的系統(tǒng)數(shù)據(jù)打通。由于N個(gè)系統(tǒng)用的數(shù)據(jù)庫(kù)有SQL-Server和Oracle兩種,之間的數(shù)據(jù)讀取成了最大的難題。;;;;我預(yù)備了兩種實(shí)行方案,進(jìn)行了技術(shù)驗(yàn)證。方案一:改寫(xiě)底層數(shù)據(jù)層和邏輯層。方案二:把Oracle數(shù)據(jù)做定時(shí)導(dǎo)向,無(wú)需讓Cms做太大的改變。;;;;我做的CMS是基于模板的系統(tǒng)架構(gòu),底層規(guī)則已經(jīng)寫(xiě)得比較死,要改換底層數(shù)據(jù)庫(kù)鏈接或者存在多個(gè)數(shù)據(jù)庫(kù)鏈接簡(jiǎn)直根重寫(xiě)系統(tǒng)沒(méi)有太大的區(qū)別,從開(kāi)發(fā)成本上分析,決定使用第二方案,做數(shù)據(jù)采集工程。;;;;但是Oracle那邊的系統(tǒng)存在N個(gè)庫(kù)(即用戶(hù)),其中的讀取規(guī)則各不相同,要如何開(kāi)發(fā)統(tǒng)一導(dǎo)表程序也是個(gè)大問(wèn)題。其中邏輯非常復(fù)雜。風(fēng)險(xiǎn)難以控制。在想了幾天之后,發(fā)現(xiàn)了MSSQL和Oracle互通的功能,大喜。接著就開(kāi)始著手開(kāi)發(fā)。于是有了這文章。;;;;在MSSQL中有個(gè)叫做鏈接服務(wù)器的功能(這個(gè)在Oracle里稱(chēng)為透明網(wǎng)關(guān))。能把不同的異類(lèi)數(shù)據(jù)庫(kù)附加鏈接到MSSQL中,做為一個(gè)“虛庫(kù)”(我給的名稱(chēng))使用。比如Oracle,DB2,Sybase,Access等等,基本上MS能提供驅(qū)動(dòng)程序的都能做。架好服務(wù)器,開(kāi)通個(gè)Job,就實(shí)現(xiàn)了定時(shí)導(dǎo)數(shù)據(jù)的功能。具體實(shí)現(xiàn):;;;;首先,在Oracle上創(chuàng)建View,給MsSql提供必要的數(shù)據(jù)源。;;;;在MsSql的服務(wù)器上安裝Oracle10g的客戶(hù)端。在ODBC創(chuàng)建好數(shù)據(jù)源。之后在MsSql上架設(shè)鏈接服務(wù)器。;;;;test一下。'SELECT id,title,thedate,summary,lid,city,ptype FROM {0}..{1}.{2}'; --0,為數(shù)據(jù)源名稱(chēng);1,為用戶(hù)名;2為表名。格式要依照PL/SQL語(yǔ)法。;ok~;;;;但是發(fā)現(xiàn),這樣讀取View出錯(cuò)。所以換了一種寫(xiě)法:;;;;select * from openquery(***,'SELECT id,title,thedate,summary,lid,city,ptype FROM ***.***')這樣是利用MsSql的分布式方法去讀取Oracle。接著,創(chuàng)建采集的存儲(chǔ)過(guò)程。SET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ON GOCREATE PROCEDURE [dbo].[usp_tranDigital] ASselect * from openquery(***,'SELECT id,title,thedate,summary,lid,city,ptype FROM ***.***')用游標(biāo)獲取結(jié)果集的行。這個(gè)方法在Oracle比較常用OPEN authors_cursorFETCH NEXT FROM authors_cursor into @ID,@TITLE,@THEDATE,@SUMMARY,@LID,@CITY,@PTYPEWHILE @@FETCH_STATUS = 0BEGINexecute Digital_Insert調(diào)用存儲(chǔ)過(guò)程插入。FETCH NEXT FROM authors_cursor into@ID,@TITLE,@THEDATE,@SUMMARY,@LID,@CITY,@PTYPEENDCLOSE authors_cursorDEALLOCATE authors_cursorGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ON GO在Job里調(diào)用該存儲(chǔ)過(guò)程。任務(wù)完結(jié)。這樣,我在不要任何程序修改的情況下,把不同數(shù)據(jù)庫(kù)上的數(shù)據(jù)都挪到同一個(gè)地方。
標(biāo)簽:
Oracle
數(shù)據(jù)庫(kù)
排行榜
