關於資料增量抽取的模擬實現 指令碼實現

2021-09-04 19:37:33 字數 4606 閱讀 9389

本文主要是針對關於資料增量抽取的模擬實現——原理

進行實現的

實現的環境:

業務資料庫: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即是把資料載入到資料倉儲的過程。通常為了盡可能的減少對業務系統的壓力和效能影響,或者因為網路傳輸異構資料庫等原因,一般都是根據特定的增量抽取原則,將資料從...