兰州做网站维护的公司,wordpress返回件,仓库管理系统app,做的很好的画册网站具体排过版的请参看http://Percywang.itpub.net本文主要是针对关于数据增量抽取的模拟实现——原理进行实现的实现的环境#xff1a;业务数据库#xff1a;Oracle9i数据仓库数据库#xff1a;SQLServer20001、前提SQLServer服务器已经安装Oracle驱动#xff0c;不再详细累述…具体排过版的请参看http://Percywang.itpub.net本文主要是针对关于数据增量抽取的模拟实现——原理进行实现的实现的环境业务数据库Oracle9i数据仓库数据库SQLServer20001、前提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 herei INTEGER;BEGIN-- Test statements hereFOR i IN 1..365 LOOPINSERT INTO SourceTableVALUES(i,i,i,i,TO_DATE(2006-01-01,yyyy-mm-dd)i);INSERT INTO SourceTableVALUES(i,i,i,i,TO_DATE(2006-01-01 12:00:00,yyyy-mm-dd hh24:mi:ss)i);END LOOPCOMMIT;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)GO5、创建SQLServer数据仓库ETL脚本脚本考虑到现实的问题已经做了许多取舍不再追求全部动态实现旨在给定一个模板在有限的范围内可以更改每次抽取的周期每次时间的跨度抽取的字段表等等数据字典表仅仅利用了其中的四个字段任务名称当前抽取时间、结束时间、抽取状态。CREATE PROCEDURE p_org_ExtractASDECLARE sql VARCHAR(3000)BEGINDECLARE BeginDate DATETIME,EndDate DATETIME,TaskName VARCHAR(32),Flag INTEGER,Num INTEGER,CurrDate DATETIMESELECT Num COUNT(TaskName) FROM ExtractTaskListWHERE UPPER(TaskName) UPPER(test)IF Num ! 1INSERT INTO ExtractTaskList(TaskName,IncType,TransType) VALUES(test,2,2)--获取列表中的当前任务的时间戳和状态SELECT BeginDate SourceDate,Flag Flag FROM ExtractTaskList WHERE TaskNameTEST--如果上次执行未成功这样取值效率会高一些则从数据仓库表中直接读取--TargetDate和SourceDate可能会不一致IF Flag 2 OR Flag IS NULLSELECT BeginDate DATEADD(ss,1,MAX(closedate)) FROM TargetTable--如果数据仓库无数据则从业务系统中直接读取也可以设置一个默认的初始化时间IF BeginDate IS NULLSELECT BeginDate MinLogDate FROM OPENQUERY(SOURCE,SELECT MIN(CloseDate) AS MinLogDate FROM SourceTable)--如果仍无数据则表示无数据可抽取退出执行IF BeginDate IS NULLRETURN--抽取结束时间为当前时间前一天,每次循环抽取1天数据,可以更改dd为hh变成按小时抽取--通常业务系统是连续的如果有疑问也可以从业务系统中获取最大时间SELECT EndDate CONVERT(DATETIME,LEFT(CONVERT(VARCHAR,GETDATE(),120),10) 00:00:00)--更新当前开始时间和结束时间UPDATE ExtractTaskListSET TargetDate BeginDate,SourceDate EndDateWHERE UPPER(TaskName) UPPER(test)WHILE BeginDate EndDateBEGINSELECT sql INSERT INTO TargetTable(ID1,ID2,Measure1,Measure2,CloseDate)SELECT * FROM OPENQUERY(SOURCE,selectID1,ID2,Measure1,Measure2,CloseDateFROM SourceTableWHERE 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 sqlEXEC (sql)--获取本次任务运行抽取的最大时间IF DATEADD(day,1,BeginDate)EndDateSELECT CurrDate EndDateELSESELECT CurrDate DATEADD(day,1,BeginDate)--如果sql执行失败同样记录状态和时间IF ERROR 0GOTO FAIL--记录每次运行的时间运行情况可提供相应参考UPDATE ExtractTaskListSET TargetDate CurrDate,Flag 1WHERE UPPER(TaskName) UPPER(test)SELECT BeginDate DATEADD(DD,1,BeginDate)ENDRETURNFAIL:--记录错误UPDATE ExtractTaskListSET TargetDate CurrDate,Flag 2WHERE UPPER(TaskName) UPPER(test)RETURN 0END