ORACLE與SQL之間的數據遷移

高級數據遷移

?????? 很多時間,要在異構數據庫之間進行數據遷移或抽取,如果在SQL中提取ORACLE的數據,可以通過ODBCOLEDB等多種方式,要從ORACLE提取SQL中的數據,大都是通過透明網關來實現的。

?????? 在異構數據抽取過程中,最好採用SQL92標準的語法編寫SQL代碼,同時要注意不同數據庫之間數據類型的轉換關係,如ORACLE的日期類型用DATESQLDatetime等。

?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

關於ORACLE的透明網關配置

?????? ORACLE安裝時(9i),將TRANSPARENT GATEWAY FOR MSSQL選中,在ORACLE主目錄/BIN中,有個tg4msql.exe程序,它是透明網關程序啦,同時在主目錄中還有tgrmsql的一個目錄,ORACLE_HOME/tg4msql/admin目錄中的inittg4msql.ora就是需要進行配置才能在ORACLE中連接SQL

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

2.1 tg4msql

1 如何配置透明網關呢?打開inittg4msql.ora:

#

# HS init parameters

# xzh代表SQL服務名,pubs代表要訪問的SQL數據庫

#

HS_FDS_CONNECT_INFO="SERVER=xzh;DATABASE=pubs"

HS_FDS_TRACE_LEVEL=OFF

HS_FDS_RECOVERY_ACCOUNT=RECOVER

HS_FDS_RECOVERY_PWD=RECOVER

2 監聽的配置oracle_home/network/admin/Listiner.ora

LISTENER =

? (DESCRIPTION_LIST =

??? (DESCRIPTION =

????? (ADDRESS_LIST =

???? ???(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))

????? )

????? (ADDRESS_LIST =

??????? (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))

????? )

??? )

? )

SID_LIST_LISTENER =

? (SID_LIST =

??? (SID_DESC =

????? (GLOBAL_DBNAME = xzh.world)

???? ?(ORACLE_HOME = D:/oracle/ora92)

????? (SID_NAME = xzh)

??? )

??? (SID_DESC =

?????? (GLOBAL_DBNAME = tg4msql)

?????? (PROGRAM = tg4msql)

?????? (SID_NAME = tg4msql)

?????? (ORACLE_HOME = D:/oracle/ora92)

??? )

? )

?????? 加亮代碼是要在監聽文件中新加部分,GLOBAL_DBNAMESID_NAME可以任意,PROGRM必須指向tg4msql如圖2.1所示。

3 本地服務文件的配置oracle_home/network/admin/TnsNames.ora

XZH =

? (DESCRIPTION =

??? (ADDRESS_LIST =

????? (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))

??? )

??? (CONNECT_DATA =

????? (SERVER = DEDICATED)

????? (SERVICE_NAME = xzh.world)

??? )

? )

?

TG4MSQL =

? (DESCRIPTION =

??? (ADDRESS_LIST =

????? (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))

??? )

??? (CONNECT_DATA =

????? (SID = tg4msql)

??? )

??? (HS = OK)

? )

?????? 使用SQL的本地服務名爲TG4MSQL,可以任意寫,SID必須是Listiner.ora中指定的那個SID_NAMEPORT也必須是監聽中指定的PORT,主機等都要符合一致。 到此爲止,我們把透明網關大致已經配置好啦,如果要訪問SQL,還要使用數據庫鏈才方便。

4 SQL中創建登錄帳號xzh口令xzh,使用可以訪問PUBS數據庫。

CREATE? DATABASE? LINK sql CONNECT TO xzh IDENTIFIED BY xzh

USING ‘TG4MSQL’

這裏的USING ‘TG4MSQL’tnsnames.ora中配置好的本地服務名,sql是我們以後要引用的數據庫鏈名。

SQL>SELECT * FROM sales@sql

如果有數據返回,表示我們訪問SQL數據庫的通道已經建成,請大膽使用吧,但對遠程異構數據庫不充許進行DDL操作。

SQL>CREATE TABLE all_users@tg4msql FRIN all_users;

?????? ???????????????*

ERROR 位於第 1 :

ORA-02021: 不允許對遠程數據庫進行 DDL 操作

?

SQL訪問ORACLE的方法

1 通過行集函數OPENDATASOURCE

?????? OPENDATASOURCE ( provider_name, init_string )

??? SELECT ?*

FROM OPENDATASOURCE(

???????? 'MSDAORA',

???????? 'Data Source=xzh.oracle;User ID=POS;Password=POS')..POS.A0325

?????? MSDAORAOLEDB FOR ORACLE的驅動,初始化字符串指定本地服務名、用戶名、口令。然後引用表中數據時要以服務器..用戶名.表名。注意一定是四部分組成,用戶名與表名一定要大寫。

?????? SELECT * INTO PUBS.DBO.A0325 FROM

OPENDATASOURCE(

???????? 'MSDAORA',

???????? 'Data Source=xzh.oracle;User ID=POS;Password=POS' )..POS.A0325

???? --ORACLEPOS模式的A0325導入SQLPUBS數據庫。

?2 通過SQL的鏈接服務器引用ORACLE的數據

?? --查看已經存在的鏈接服務器

?? SELECTFROM SYSSERVERS

?? --添加鏈接服務器到SQL

?? EXEC SP_ADDLINKEDSERVER

?? @server = 'ORCL',??????????????????? --ORCLSQL中鏈接服務器名稱

?? @srvproduct = 'Oracle',        --Oracle??????? 固定的            

?? @provider = 'MSDAORA',???????????? --MSDAORA?? 固定的

?? @datasrc = 'xzh.oracle'???????????????? --DataSrc????? 本地服務名

??

?? EXEC SP_DROPSERVER ‘ORCL’?????? --刪除鏈接服務器

??

?????? 在這裏聲明一下,如果現在就訪問ORACLE肯定不能,因爲沒有提供登錄ORACLE的用戶名/口令

?????? EXEC SP_ADDLINKEDSRVLOGIN 'ORCL', false, 'sa', 'POS', 'POS'

SaSQL本地登錄帳號,POS/POSORACLE的登錄帳號,但這句話對我們要達到的目的沒有幫助。

SELECT * FROM ORCL..POS.A0325

還是四部分組成,注意事項同上,爲什麼不行呢,本人一直在尋找解決辦法,最後發現通過SQL語句沒法解決,只有打開SQL的企業管理器。

2.2 配置ORACLE的遠程帳號

2.3設置遠程登錄帳號

SELECT * FROM ORCL..POS.A0325?? --這次終於OK

SELECT * FROM OPENQUERY(ORCL, 'SELECT * FROM POS.A0325')

3 使用SQLOPENROWSET函數

SELECT a.*

FROM OPENROWSET('MSDAORA',

?? 'xzh.oracle';'POS';'POS', POS.A0325) AS a ORDER BY a.ID

?

有些地方要用別名才能引用,請大家注意。

?

4使用ODBC的方式

SELECT A.*

FROM OPENROWSET('MSDASQL','ORCL_ODBC';'POS';'POS',

?? POS.A0325) AS ?A

ORDER BY A.ID

?

ORCL_ODBCORACLEODBC數據源,創建ODBC不用我說吧,以上所有代碼在SQL QUERY ANALYZE 中通過。

?

總結

?????? 關於SQL訪問ORACLE有四種方式,其中通過ODBC與鏈接服務器的方式做起來難度較大,對手新手會麻煩一些,使用OLE DB FOR ORACL驅動時,有OPENDATASOURCEOPENROWSET函數可以使用,都很方便,筆記喜歡使用後者,交待一下,在數據存取方面,這四種方面效率相當。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章