本文主要是針對關於資料增量抽取的模擬實現——原理
進行實現的
實現的環境:
業務資料庫:oracle9i
資料倉儲資料庫:sqlserver2000
1、前提sqlserver伺服器已經安裝oracle驅動,不再詳細累述
2、建立鏈結資料庫
開啟企業管理器->安全性-鏈結伺服器-右鍵新建
一般情況下執行c:program filescommon filessystemole dbmtxoci81_win2k.reg該檔案後,重啟sqlserver資料庫,再重新連線;
如果仍有問題,重啟作業系統,即可ok。
3、建立oracle環境指令碼
-- 建立 oracle 業務系統表結構
create table sourcetable (
id1 varchar2(50),
id2 varchar2(50),
measure1 integer,
measure2 integer,
closedate date
) -- 建立測試資料
declare
-- local variables here
i integer;
begin
-- test statements here
for i in 1..365 loop
insert into sourcetable
values(i,i,i,i,to_date('2006-01-01','yyyy-mm-dd')+i);
insert into sourcetable
values(i,i,i,i,to_date('2006-01-01 12:00:00','yyyy-mm-dd hh24:mi:ss')+i);
end loop
commit;
end;
4、建立sqlserver資料倉儲環境指令碼
-- 建立系統參數列內
create table extracttasklist (
taskname varchar(32) ,
targettable varchar(32) ,
targetfieldlist varchar(500) ,
sourcetable varchar(32) ,
sourcefieldlist varchar(500) ,
wherefieldname varchar(32) ,
inctype int ,
transtype int ,
targetdate datetime ,
sourcedate datetime ,
flag int ,
note varchar (500)
) go
-- 建立資料倉儲目標表
create table targettable (
id1 varchar(50) ,
id2 varchar(50) ,
measure1 decimal(18, 0) ,
measure2 decimal(18, 0) ,
closedate datetime
) go
5、建立sqlserver資料倉儲etl指令碼
指令碼考慮到現實的問題,已經做了許多取捨,不再追求全部動態實現,旨在給定乙個模板,在有限的範圍內可以更改每次抽取的週期,每次時間的跨度,抽取的字段,表等等;資料字典表僅僅利用了其中的四個字段:任務名稱,當前抽取時間、結束時間、抽取狀態。
create procedure p_org_extract
asdeclare @sql varchar(3000)
begin
declare @begindate datetime,
@enddate datetime,
@taskname varchar(32),
@flag integer,
@num integer,
@currdate datetime
select @num = count(taskname) from extracttasklist
where upper(taskname) = upper('test')
if @num != 1
insert into extracttasklist(taskname,inctype,transtype) values('test',2,2)
-- 獲取列表中的當前任務的時間戳和狀態
select @begindate = sourcedate,@flag = flag from extracttasklist where taskname='test'
-- 如果上次執行未成功,這樣取值效率會高一些,則從資料倉儲表中直接讀取
--targetdate 和 sourcedate 可能會不一致
if @flag = 2 or @flag is null
select @begindate = dateadd(ss,1,max(closedate)) from targettable
-- 如果資料倉儲無資料,則從業務系統中直接讀取,也可以設定乙個預設的初始化時間
if @begindate is null
select @begindate = minlogdate from openquery(source,'select min(closedate) as minlogdate from sourcetable')
-- 如果仍無資料,則表示無資料可抽取,退出執行
if @begindate is null
return
-- 抽取結束時間為當前時間前一天 , 每次迴圈抽取 1 天資料 , 可以更改 dd 為 hh ,變成按小時抽取
-- 通常業務系統是連續的,如果有疑問也可以從業務系統中獲取最大時間
select @enddate = convert(datetime,left(convert(varchar,getdate(),120),10)+' 00:00:00')
-- 更新當前開始時間和結束時間
update extracttasklist
set targetdate = @begindate,
sourcedate = @enddate
where upper(taskname) = upper('test')
while @begindate < @enddate
begin
select @sql = ' insert into targettable (
id1,
id2,
measure1,
measure2,
closedate
)select * from openquery(source,''select
id1,
id2,
measure1,
measure2,
closedate
from sourcetable
where closedate >= to_date(''''' + convert(varchar,@begindate,120) + ''''', ''''yyyy-mm-dd hh24:mi:ss'
+ ''''') and closedate < to_date(''''' + convert(varchar,dateadd(day,1,@begindate),120) + ''''', ''''yyyy-mm-dd hh24:mi:ss'
+ ''''') and closedate < to_date(''''' + convert(varchar,@enddate,120) + ''''', ''''yyyy-mm-dd hh24:mi:ss'
+ ''''')'')'
--print @sql
exec (@sql)
-- 獲取本次任務執行抽取的最大時間
if dateadd(day,1,@begindate)>@enddate
select @currdate = @enddate
else
select @currdate = dateadd(day,1,@begindate)
-- 如果 @sql 執行失敗,同樣記錄狀態和時間
if @@error <> 0
goto fail
-- 記錄每次執行的時間運**況,可提供相應參考
update extracttasklist
set targetdate = @currdate,
flag = 1
where upper(taskname) = upper('test')
select @begindate = dateadd(dd,1,@begindate)
end
return
fail:
-- 記錄錯誤
update extracttasklist
set targetdate = @currdate,
flag = 2
where upper(taskname) = upper('test')
return 0
end
關於資料增量抽取的模擬實現 原理
原創於2006年12月28日,2009年10月15日遷移至此。etl是資料倉儲的乙個重要處理環節,extract即是從業務資料庫中抽取資料 transform即是根據業務邏輯規則對資料進行加工的過程,load即是把資料載入到資料倉儲的過程。通常為了盡可能的減少對業務系統的壓力和效能影響,或者因為網路...
關於資料增量抽取的模擬實現 原理
etl是資料倉儲的乙個重要處理環節,extract即是從業務資料庫中抽取資料 transform即是根據業務邏輯規則對資料進行加工的過程,load即是把資料載入到資料倉儲的過程。通常為了盡可能的減少對業務系統的壓力和效能影響,或者因為網路傳輸異構資料庫等原因,一般都是根據特定的增量抽取原則,將資料從...
關於資料增量抽取的模擬實現 原理
etl是資料倉儲的乙個重要處理環節,extract即是從業務資料庫中抽取資料 transform即是根據業務邏輯規則對資料進行加工的過程,load即是把資料載入到資料倉儲的過程。通常為了盡可能的減少對業務系統的壓力和效能影響,或者因為網路傳輸異構資料庫等原因,一般都是根據特定的增量抽取原則,將資料從...