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