这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。 我也要与时俱进了,被itpub2.0牵着尾巴,拼命的奔跑,不停的灌水...

关于数据增量抽取的模拟实现——脚本实现

上一篇 / 下一篇  2008-02-14 22:07:51 / 个人分类:数据仓库专区

本文主要是针对关于数据增量抽取的模拟实现——原理进行实现的

实现的环境:

业务数据库:Oracle9i

数据仓库数据库:SQLServer2000


(C;?-i"O$F*\!R01、前提SQLServer服务器已经安装Oracle驱动,不再详细累述ITPUB个人空间orT5~G0IU
2、创建链接数据库
eDOw-n.y0打开企业管理器->安全性-链接服务器-右键新建ITPUB个人空间 gSP7KK)vq
数据仓库
p5q|-Q*V&{0通常情况当链接数据库创建好,进行打开的时候都会弹出一下错误窗口:ITPUB个人空间/HZ#b8u#\$Z]:Ajf
数据仓库
.p)nyO$VBwI1g0一般情况下运行C:Program FilesCommon FilesSystemOle DBmtxoci81_win2k.reg该文件后,重启SQLServer数据库,再重新连接;
&}+`S4G!gc.@0如果仍有问题,重启操作系统,即可OK。ITPUB个人空间%tg*_#ZJ'qP'e
3、创建Oracle环境脚本ITPUB个人空间"v8P7z4~5V8V+P

--创建Oracle业务系统表结构

CREATE TABLE SourceTableITPUB个人空间m A$mM+c}/g|6Dx%~
(
)yGe2D,k`:[kQ0ID1 VARCHAR2(50),
v:\ q7`S;K%`7r{0ID2 VARCHAR2(50),
t(yv#x'GX0Measure1 INTEGER,
M'}R.{d\0Measure2 INTEGER,ITPUB个人空间S6DXG1b-q
CloseDate DATEITPUB个人空间h_.~&Mwu OD2]
)

--创建测试数据

DECLARE

-- Local variables here
d!c/l8GXn \Y@g0i INTEGER;

BEGIN

-- Test statements here

FOR i IN 1..365 LOOP

INSERT INTO SourceTableITPUB个人空间2d1Mq;?Ca!A#V3H
VALUES(i,i,i,i,TO_DATE('2006-01-01','yyyy-mm-dd')+i);
1xraNbt0j(A0INSERT INTO SourceTableITPUB个人空间k#q.Q+g1z/p3G
VALUES(i,i,i,i,TO_DATE('2006-01-01 12:00:00','yyyy-mm-dd hh24:mi:ss')+i);

ENDLOOP
4}!h ]'O!Dfu]8M(p0COMMIT;

END;


Z~h ^,X4Z;Jd04、创建SQLServer数据仓库环境脚本ITPUB个人空间KA2|,p;vS7S1J

--创建系统参数表内

CREATE TABLE ExtractTaskList (ITPUB个人空间F6\~2T~@)V/Kh
TaskName VARCHAR(32) ,
!SV]QO,B0TargetTable VARCHAR(32) ,
v` VR$y|q0TargetFieldList VARCHAR(500) ,ITPUB个人空间AB!mg1V4}(xe
SourceTable VARCHAR(32) ,
U)E#^7K}9R,Dv0SourceFieldList VARCHAR(500) ,ITPUB个人空间v ?L#^k,\Ta`,E2}
WhereFieldName VARCHAR(32) ,
@?-_|H0IncType INT,ITPUB个人空间G^qFVMP;d8U
TransType INT,
L"V\*g1s/GI0TargetDate DATETIME,
IgD @'G~MQ3~0SourceDate DATETIME,
M2qU$Q2x Q6c ]x&tw G0Flag INT,
4bMwc6N/q0Note VARCHAR (500)ITPUB个人空间E6j;F7M#O6{,` A7fM
)

GO

--创建数据仓库目标表

CREATE TABLE TargetTable (
l.Q"IAd0ID1 VARCHAR(50),
,nf g3D[/L/Tg }0ID2 VARCHAR(50),
GZDV+b%e{9Z} a0Measure1 DECIMAL(18, 0),ITPUB个人空间 @+Wq,e/]'mvk'F
Measure2 DECIMAL(18, 0),
Eb"uX H0CloseDate DATETIMEITPUB个人空间qE(GAV:p Q&~7J
)

GO


sG8Pp_05、创建SQLServer数据仓库ETL脚本ITPUB个人空间 dg;aDv6T1G
脚本考虑到现实的问题,已经做了许多取舍,不再追求全部动态实现,旨在给定一个模板,在有限的范围内可以更改每次抽取的周期,每次时间的跨度,抽取的字段,表等等;数据字典表仅仅利用了其中的四个字段:任务名称,当前抽取时间、结束时间、抽取状态。

CREATE PROCEDURE p_org_Extract
\3Id6W)M0ASITPUB个人空间 }-` eAQp$_9P
DECLARE @sql VARCHAR(3000)

BEGIN

DECLARE @BeginDateDATETIME,ITPUB个人空间w&A!q-O iTi
@EndDateDATETIME,
8gsy M wy5C+gd'g uE0@TaskNameVARCHAR(32),
"k8h c!R^G pe0@FlagINTEGER,
3\ C{ |.K&|O0@NumINTEGER,
S1_%v8NNlRSB u0@CurrDateDATETIME

SELECT @Num = COUNT(TaskName) FROM ExtractTaskListITPUB个人空间4}%mL I*SQs-W#T`V
WHERE UPPER(TaskName) = UPPER('test')

IF @Num != 1ITPUB个人空间]h9XH1m6@
INSERT INTO ExtractTaskList(TaskName,IncType,TransType) VALUES('test',2,2)

--获取列表中的当前任务的时间戳和状态
l F0a;nOH4X+Y6M J0SELECT @BeginDate = SourceDate,@Flag = Flag FROM ExtractTaskList WHERE TaskName='TEST'

--如果上次执行未成功,这样取值效率会高一些,则从数据仓库表中直接读取ITPUB个人空间!bK\!cD Y#D8gy
--TargetDate
SourceDate可能会不一致
_-kI \2T6X%tCHk0IF @Flag = 2 OR @Flag IS NULL
;VXFfj@0SELECT @BeginDate = DATEADD(ss,1,MAX(closedate)) FROM TargetTable

--如果数据仓库无数据,则从业务系统中直接读取,也可以设置一个默认的初始化时间ITPUB个人空间/p OoB"Be@v vz4X
IF @BeginDate IS NULLITPUB个人空间A.ll4B,SFo
SELECT @BeginDate = MinLogDate FROM OPENQUERY(SOURCE,'SELECT MIN(CloseDate) AS MinLogDate FROM SourceTable')

--如果仍无数据,则表示无数据可抽取,退出执行
)r md&KW2It0IF @BeginDate IS NULLITPUB个人空间,aQ!R,I#q1c L
RETURNITPUB个人空间 ck},_o$p{p

5a+n0aH%r8i9b0--
抽取结束时间为当前时间前一天,每次循环抽取1天数据,可以更改ddhh,变成按小时抽取
/a g'f8QB$O^g _0--
通常业务系统是连续的,如果有疑问也可以从业务系统中获取最大时间ITPUB个人空间v4|N'k1|8q
SELECT @EndDate = CONVERT(DATETIME,LEFT(CONVERT(VARCHAR,GETDATE(),120),10)+' 00:00:00')

--更新当前开始时间和结束时间
CY;{x!C8a$bn0UPDATE ExtractTaskList
#K(}&Hh e)Hm0SET TargetDate = @BeginDate,
kvf-pA0SourceDate = @EndDate
1M;wr._JP| {?0WHERE UPPER(TaskName) = UPPER('test')
f(O;A Zk1gD s0
PY,C*K.K8e0WHILE @BeginDate < @EndDateITPUB个人空间"At*zX;wF.J_2D
BEGINITPUB个人空间iBt)LC/`s nI!Y5d
SELECT @sql = ' INSERT INTO TargetTable
\ G&t5_sW X0(ITPUB个人空间 y!T-m2|"J]Ip
ID1,
\2?4z}0y U }4i,J)T0ID2,
e:ac3p`Z$PP#k a:L0Measure1,
s,If+~-iLN(M0Measure2,
j{o{xn3w~0CloseDateITPUB个人空间 W#|M9G~$ccG VFBC
)SELECT * FROM OPENQUERY(SOURCE,''selectITPUB个人空间L7s H2v"?2Ec
ID1,ITPUB个人空间kG$R:Qa7t(]n
ID2,ITPUB个人空间 z!L;L%XFk
Measure1,
S6zRv3`'^LwU"i(|0Measure2,ITPUB个人空间a)R3P*dP|0Y,]
CloseDate
i r)w NY0FROM SourceTableITPUB个人空间T Xpx(f9R*v!p
WHERE CloseDate >= TO_DATE(''''' + CONVERT(varchar,@BeginDate,120) + ''''', ''''YYYY-MM-DD HH24:MI:SS'ITPUB个人空间7Ln@ry
+ ''''') AND CloseDate < TO_DATE(''''' + CONVERT(varchar,DATEADD(day,1,@BeginDate),120) + ''''', ''''yyyy-mm-dd HH24:MI:SS'ITPUB个人空间'^.J#Ch;VY"A7h)C7o
+ ''''') AND CloseDate < TO_DATE(''''' + CONVERT(varchar,@EndDate,120) + ''''', ''''YYYY-MM-DD HH24:MI:SS'
$r,n2~{g+OO0
+ ''''')'')'
h\ J4~'?9sCG9d1U-I0--PRINT @sql
*_ @/LQ;|k7H3r/E0EXEC (@sql)
xk{ b0?B0
,i aol:zD9E C0
--获取本次任务运行抽取的最大时间ITPUB个人空间*@*M8v/o9_A
IF DATEADD(day,1,@BeginDate)>@EndDateITPUB个人空间P]4r8n-w
SELECT @CurrDate = @EndDateITPUB个人空间%ik:a^:p#n L7q
ELSE
|T`7Z*_,\%SX0SELECT @CurrDate = DATEADD(day,1,@BeginDate)

--如果@sql执行失败,同样记录状态和时间ITPUB个人空间p;yzno*z`yB
IF @@ERROR <> 0ITPUB个人空间.^ DF+De#d2t ]:| j%x
GOTO FAIL

--记录每次运行的时间运行情况,可提供相应参考ITPUB个人空间6Oq\9dT!Yk
UPDATE ExtractTaskListITPUB个人空间{2l vQeu;V
SET TargetDate = @CurrDate,
&|0cL q ^4Ah#n0Flag = 1ITPUB个人空间b(R,Q`cv
WHERE UPPER(TaskName) = UPPER('test')

SELECT @BeginDate = DATEADD(DD,1,@BeginDate)

END

RETURN

FAIL:

--记录错误

UPDATE ExtractTaskList
$N+\!D T~.a)]0SET TargetDate = @CurrDate,
+yp,t4[f0Flag = 2ITPUB个人空间5Y+o5{A.qoQ#Y'_o S
WHERE UPPER(TaskName) = UPPER('test')

RETURN 0

END


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-26  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 18920
  • 日志数: 64
  • 建立时间: 2007-12-07
  • 更新时间: 2008-07-24

RSS订阅

Open Toolbar