簡(jiǎn)明扼要介紹Oracle Provider
Oracle有很多值得學(xué)習(xí)的地方,這里我們主要介紹Oracle provider,包括介紹Oracle table等方面。從SQL Server將資料新增至Oracle table時(shí),不需要包含INTO關(guān)鍵詞。Microsoft和Oracle的OLE DB providers在Oracle Server上執(zhí)行INSERT 指令時(shí)都會(huì)自動(dòng)加上INTO關(guān)鍵詞。
我使用Oracle Provider for OLE DB建立了一個(gè)新的連結(jié)服務(wù)器,名稱定為orclprvdr。并嘗試對(duì)該連結(jié)服務(wù)器執(zhí)行INSERT指令,這個(gè)指令是可以被成功執(zhí)行的。所以您可以發(fā)現(xiàn):在透過連結(jié)服務(wù)器執(zhí)行INSERT指令時(shí),Oracle provider提供較多的優(yōu)點(diǎn)!然而,如果 table內(nèi)某字段有設(shè)定DEFAULT約束條件,則使用Oracle provider會(huì)無法執(zhí)行INSERT指令加入數(shù)據(jù)。不同的是,如果您使用 Microsoft的provider,只要傳遞實(shí)際的字段值,而非使用DEAULT關(guān)鍵詞,則INSERT指令就可以執(zhí)行。
這個(gè)查詢并沒有特別設(shè)定dname,loc字段為NULL值,但仍舊可以執(zhí)行。如果是使用Microsoft OLE DB provider for Oracle就必須給定其字段值。UPDATE指令使用在可允許NULL值存放的字段上就不會(huì)有問題,這點(diǎn)和INSERT指令不同。如果是對(duì)Oracle執(zhí)行UPDATE指令,不想修改的字段可以不用列出。
如果您需要針對(duì)SQL Server與Oracle的table進(jìn)行聯(lián)集(join)查詢,就必須要有連結(jié)服務(wù)器才能執(zhí)行這類的異質(zhì)性查詢。為了建立下面的范例程序,我使用了資料轉(zhuǎn)換服務(wù)(Data Transformation Services,DTS) 將Northwind數(shù)據(jù)庫內(nèi)的Orders table復(fù)制一份到Oracle數(shù)據(jù)庫內(nèi)的SCOTT schema之下,并且將預(yù)設(shè)的目的地從 "SCOTT"."Orders" 改成 "SCOTT"."ORDERS"。我在這里使用大寫子母的原因是為了避免在Oracle工具內(nèi)使用到該table時(shí)還要加上雙引號(hào)。雖然Oracle數(shù)據(jù)庫有支持大小寫混合式數(shù)據(jù)庫對(duì)象名稱,但是全部使用大寫來命名對(duì)象名稱的話,對(duì)于Oracle數(shù)據(jù)庫管理以及程序開發(fā)將會(huì)變得較為容易!
下列范例將針對(duì)Northwind 數(shù)據(jù)庫的Employees table 與SCOTT的Order table
進(jìn)行聯(lián)集查詢:
- SELECT lastname FROM employees e
- INNER JOIN oradb..SCOTT.ORDERS o
- ON e.employeeid = o.employeeid
- WHERE o.orderid = 10248
如果您所執(zhí)行的這類查詢指令必須置于一個(gè)交易(transaction)內(nèi),則SQL Server所在的服務(wù)器必須激活交易協(xié)調(diào)器(Microsoft Distributed Transaction Coordinator (MS DTC)這項(xiàng)服務(wù)。
以下提供數(shù)種使用連結(jié)服務(wù)器進(jìn)行查詢的方式。例如SQL Server的OPENQUERY 系統(tǒng)函數(shù)會(huì)將查詢指令整個(gè)從SQL Server傳遞至Oracle:
- SELECT *
- FROM OPENQUERY (oradb,' SELECT * FROM dept
- WHERE deptno = 10' )
使用OPENQUERY并不會(huì)在查閱Oracle系統(tǒng)資料(metadata)時(shí)造成額外影響。有了OPENQUERY這個(gè)函數(shù),所有查詢動(dòng)作都會(huì)發(fā)生在 Oracle連結(jié)服務(wù)器上,可避免查詢系統(tǒng)資料所可能增加的系統(tǒng)負(fù)擔(dān)。使用OPENQUERY來執(zhí)行連結(jié)服務(wù)器的查詢指令是一項(xiàng)較佳的選擇,但是您無法在異質(zhì)性的查詢指令中使用!
至于OPENROWSET 則是一種不需要事先設(shè)定連結(jié)服務(wù)器就可以執(zhí)行的一種轉(zhuǎn)嫁查詢(pass-through query)。除了您必須指定聯(lián)機(jī)時(shí)需要的所有資料作為輸入?yún)?shù)之外,其功能與OPENQUERY函數(shù)類似:
- SELECT *
- FROM OPENROWSET (' MSDAORA','Ora817'; 'SCOTT';'TIGER',
- ' SELECT * FROM dept
- WHERE deptno = 10' )
本文所提到的連結(jié)服務(wù)器只用來執(zhí)行查詢指令,但是您也可以透過連結(jié)服務(wù)器執(zhí)行預(yù)儲(chǔ)程序。以上介紹Oracle provider。
【編輯推薦】