ORACLE 8i的普通連接技術的介紹
====================================
歡迎大家同我交流:小白 [email protected]
歡迎轉載,請保留本聲明,謝謝!
====================================
Oracle 8.1.6 中引入普通連接技術的概念(Generic connectivity),這一連接解決方案滿足了對許多異種數據庫存儲的數據訪問需求,同時並不需要安裝ORACLE的透明網關(ORACLE Transparent Gateway)。該特性允許使用業界標準 ODBC 和 OLEDB 建立透明連接。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
什麼是普通連接(Generic connectivity)
普通連接是ORACLE的一個低端數據集成解決方案,目標是提供ORACLE 8i可以連接到非oracle數據庫的能力。它的實現,是通過異種服務代理(Heterogeneous Services)來實現的。
異種服務代理的類型:
-
ODBC agent for accessing ODBC data providers
-
OLE DB agent for accessing OLE DB data providers that support SQL processing--sometimes referred to as OLE DB (SQL)
-
ODBC agent for acceng OLE DB data providers without SQL processing support--sometimes referred to as OLE DB (FS)
普通連接的系統結構圖
ORACLE客戶端程序訪問非ORACLE數據庫的過程:客戶端程序是通過SQL*NET連接ORACLE服務器,關於異種數據庫的訪問,交給HS代理實現。
HS代理通過下面的功能組件實現:ODBC管理器->ODBC驅動程序->數據庫的網絡客戶端->目標數據庫。
如果異種庫和ORACLE數據庫位於同一臺服務器上,一般來說驅動程序是可以直接和本機的數據庫通訊,就可以省去數據庫的網絡客戶端這一層。
數據類型的轉換
ORACLE自動實現ODBC和OLEDB數據類型到ORACLE數據類型的轉換,具體的對應轉換可以參考ORACLE的聯機幫助http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76960/datatype.htm。
普通連接的限制
1 含有BLOB列的表必須要有一個主鍵字段;
2 BLOB/CLOB數據不直接通過pass-through的查詢方式;
3 在WHERE子句中包括了函數的Updates或deletes語句不被允許;
4 不支持存儲過程的調用;
HS代理(odbc/oledb)不支持分佈式事務(distributed transactions),只支持單點的事務(single-site transactions)。
普通連接代理的配置
下面,我介紹一下,利用普通連接的ODBC配置。利用HS odbc代理連接SQL SERVER 2000。
第一步初始化文件的建立
首先,你必須要創建初始化文件。ORACLE提供了樣例初始化文件,名字是init<agent>.ora,<agent>可能是hsodbc,hsoledb,hsolefs,分別代表了三種類型的代理,位於$ORACLE_HOME/HS/ADMIN下。
把對應的文件複製一份出來,並且改名爲init<HS_SID>.ora,<HS_SID>是你SQL SERVER ODBC代理起的別名。
複製並創建了一個inithssql2k.ora文件,編輯inithssql2k.ora文件。參數有:
# This is a sample agent init file that contains the HS parameters that are # needed for an ODBC Agent.
# # HS init parameters # #HS_FDS_CONNECT_INFO = <odbc data_source_name> #HS_FDS_TRACE_LEVEL = <trace_level> HS_FDS_CONNECT_INFO = SQL2K HS_FDS_TRACE_LEVEL = ON HS_AUTOREGISTER = TRUE
# # Environment variables required for the non-Oracle system # #set <envvar>=<value> |
第二步 創建異種服務代理的數據字典
執行$ORACLE_HOME/rdbms/admin/caths.sql,創建相關的系統表和視圖。
第三步 創建異種服務代理的工作環境
添加hssql2k的偵聽服務,$ORACLE_HOME/NETWORK/ADMIN/listener.ora
SID_DESC= (SID_NAME=hssql2k) (ORACLE_HOME=d:/oracle/ora81) (PROGRAM=hsodbc) ) |
修改$ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora,添加一個網絡服務名
sql2k,將在後面創建數據庫聯接時用到。
sql2k = (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)) (CONNECT_DATA=(SID=hssql2k)) (HS=OK) ) |
重新啓動偵聽,並且察看服務狀態
LSNRCTL for 32-bit Windows: Version 8.1.7.0.0 - Production on 02-JUL-2003 12:49: 30
(c) Copyright 1998 Oracle Corporation. All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> status Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SAM)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for 32-bit Windows: Version 8.1.7.0.0 - Produ tion Start Date 02-JUL-2003 11:08:31 Uptime 0 days 1 hr. 41 min. 2 sec Trace Level off Security OFF SNMP OFF Listener Parameter File d:/oracle/ora81/network/admin/listener.ora Listener Log File d:/oracle/ora81/network/log/listener.log Services Summary... ORCL has 1 service handler(s) ORCL has 3 service handler(s) PLSExtProc has 1 service handler(s) hssql2k has 1 service handler(s) The command completed successfully LSNRCTL> |
Hssql2k的偵聽服務已經正常運行了。
第四步 修改數據庫啓動參數文件
修改數據庫啓動參數文件,設置global_names=false,如果設置爲true(缺省),那麼數據庫連接名和全局數據庫名一樣,這將會導致ORA-02085的錯誤。
第五步 創建訪問non-oracle數據庫的連接(Database Link)
在sqlplus中,執行create database link命令。Connect to 指定了連接到SQL SERVER的用戶名和密碼。
SQL>create public database link sql2k connect to sa identified by manager using ‘sql2k’; Database link created.
|
第六步 測試
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production
SQL> connect scott/tiger; Connected. SQL> select count(*) from sysobjects@sql2k;
COUNT(*) ---------- 135 |
現在,oracle已經可以訪問sqlserver數據庫了。以上都是,筆者參考了oracle的聯機幫助,並且實際測試的經過。筆者同時也發現,採用hsodbc其實也並不是很穩定,有的sql語句會引起hsodb agent的致命錯誤,同時有很多限制,採用透明網關應該就可以獲得很好的效果。
但是, oracle 8i的這個特性,可以不安裝額外的Transparent Gateway產品。因此,只要能夠滿足應用的數據訪問要求,採用Generic connectivity也不失爲一個快速,經濟的方法。
筆者的測試環境:Windows2000 Server+ORACLE 8i(8.1.7)