ORACLE與SQL之間的數據遷移
2024-08-29 13:31:07
供稿:網友
高級數據遷移
很多時間,要在異構數據庫之間進行數據遷移或抽取,如果在sql中提取oracle的數據,可以通過odbc、oledb等多種方式,要從oracle提取sql中的數據,大都是通過透明網關來實現的。
在異構數據抽取過程中,最好采用sql92標準的語法編寫sql代碼,同時要注意不同數據庫之間數據類型的轉換關系,如oracle的日期類型用date、sql用datetime等。
一 關于oracle的透明網關配置
oracle安裝時(9i),將transparent gateway for mssql選中,在oracle主目錄/bin中,有個tg4msql.exe程序,它是透明網關程序啦,同時在主目錄中還有tgrmsql的一個目錄,oracle_home/tg4msql/admin目錄中的inittg4msql.ora就是需要進行配置才能在oracle中連接sql。
圖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_dbname、sid_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_name,port也必須是監聽中指定的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 [email protected]
如果有數據返回,表示我們訪問sql數據庫的通道已經建成,請大膽使用吧,但對遠程異構數據庫不充許進行ddl操作。
sql>create table [email protected] 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
msdaora是oledb for oracle的驅動,初始化字符串指定本地服務名、用戶名、口令。然后引用表中數據時要以服務器..用戶名.表名。注意一定是四部分組成,用戶名與表名一定要大寫。
select * into pubs.dbo.a0325 from
opendatasource(
'msdaora',
'data source=xzh.oracle;user id=pos;password=pos' )..pos.a0325
--將oracle中pos模式的a0325導入sql的pubs數據庫。
2 通過sql的鏈接服務器引用oracle的數據
--查看已經存在的鏈接服務器
select*from sysservers
--添加鏈接服務器到sql
exec sp_addlinkedserver
@server = 'orcl', --orcl是sql中鏈接服務器名稱
@srvproduct = 'oracle', --oracle 固定的
@provider = 'msdaora', --msdaora 固定的
@datasrc = 'xzh.oracle' --datasrc 本地服務名
exec sp_dropserver ‘orcl’ --刪除鏈接服務器
在這里聲明一下,如果現在就訪問oracle肯定不能,因為沒有提供登錄oracle的用戶名/口令
exec sp_addlinkedsrvlogin 'orcl', false, 'sa', 'pos', 'pos'
sa是sql本地登錄帳號,pos/pos是oracle的登錄帳號,但這句話對我們要達到的目的沒有幫助。
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 使用sql的openrowset函數
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_odbc是oracle的odbc數據源,創建odbc不用我說吧,以上所有代碼在sql query analyze 中通過。
三 總結
關于sql訪問oracle有四種方式,其中通過odbc與鏈接服務器的方式做起來難度較大,對手新手會麻煩一些,使用ole db for oracl驅動時,有opendatasource與openrowset函數可以使用,都很方便,筆記喜歡使用后者,交待一下,在數據存取方面,這四種方面效率相當。