java数据抽取到数据仓库_关于数据增量抽取的模拟实现——脚本实现

具体排过版的请参看http://Percywang.itpub.net

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

实现的环境:

业务数据库: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

AS

DECLARE @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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过此注释改善您的JUnit体验

JUnit可能是所有Java项目中90&#xff05;的一部分。 令人兴奋的是&#xff0c;我们很快将拥有支持Java 8的JUnit 5 。 我们最近在博客上发表了一项改进 。 回到JUnit 4领域&#xff0c;有一个小技巧&#xff0c;我只能建议您进行所有单元测试。 只需在此处添加这个小注释&…

HDU 3555 Bomb (数位DP)

数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数&#xff0c;它是按位来进行计数统计的&#xff0c;可以保存子状态&#xff0c;速度较快。数位dp做多了后&#xff0c;套路基本上都差不多&#xff0c;关键把要保存的状态给抽象出来&#xff0c;保存下来…

java rsa 117_java实现RSA非对称加密解密

之前写过一篇java实现AES对称加密解密在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合。原理就是后台生成一对公钥和私钥&#xff0c;公钥给前端用来加密&#xff0c;后台用私钥去解密&#xff0c;保证了传输过程中就算被截获也避免密码泄露。下面是代码&#xff1a…

CodeForces 731C Socks

//并查集的应用 #include <bits/stdc.h> using namespace std; const int N 2e5 5; int f[N]; int color[N]; vector<int>num[N]; int findx(int x) {return ( x f[x]? x: f[x] findx(f[x]) ); } void merge(int x, int y) {int fx findx(x);int fy findx(y…

php多条件筛选顺序_php多条件组合筛选

【实例简介】js搞定多条件组合筛选&#xff0c;实现URL动态变化&#xff0c;后台根据URL参数实现查询【实例截图】【核心代码】filter└── filter├── css│ ├── bootstrap.css│ ├── bootstrap.css.map│ ├── bootstrap.min.css│ ├── bootstrap-resp…

jdeveloper_JDeveloper中的Java反编译器

jdeveloperJava Decompiler是一个独立的图形实用程序&#xff0c;显示“ .class”文件的Java源代码。 下面是Java Decompiler程序的快照 您可以从这里下载该程序 我将说明如何在Jdeveloper中将此程序用作外部工具 Java Decompiler和Jdeveloper之间的集成 您可以将此程序添加…

文件上传 java 完美,vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData())...

vuejava实现文件上传(excel等)&#xff0c;会出现跨域问题&#xff0c;直接用form表单提交就不会有问题了(new FormData())地址&#xff1a;https://www.cnblogs.com/muscles/p/9503103.html一&#xff1a;首先说一下什么是跨域&#xff0c;跨域就是解决浏览器同源策略的问题。…

abp的权限与导航菜单的关系

原来以为各是各的,所以就有了第一个版本.Getallmentus.然后注入了role,当然失败了.获取所有的菜单.一直在思考在什么地方设置菜单是否展示呢? 后面看了源码.才发现自己错了. UserNavigationManager(这个是一个框架内部调用的类)会获取当前userid的所有的菜单, 数据源跟菜单的R…

通过Java 8流使用Oracle AQ

Oracle数据库最令人敬畏的功能之一是Oracle AQ&#xff1a;Oracle数据库高级队列 。 AQ API直接在数据库中实现了完整的事务性消息传递系统。 在数据库位于系统中心的经典体系结构中&#xff0c;使用AQ进行进程间通信时&#xff0c;多个应用程序&#xff08;其中一些应用程序用…

藏经阁

藏经阁 收藏经典书籍&#xff0c; 文学 1.霍乱时期的爱情 2.巨人的陨落 3.群山之巅 4.无人生还 5.加缪文集&#xff0c;1995&#xff0c;译林出版 6.1984 7.黄金时代 8.太阳照常升起 9.月亮和六便士 10.白夜行 11.小王子 12.杀死一只知更鸟 社科 1.高效能人士的七个习惯 2.少有…

php private方法,php如何调用private方法

php调用private方法&#xff1a;首先定义一个parent类&#xff1b;然后在类的内部使用私有函数&#xff1b;接着实例化parent类&#xff0c;让其变成一个对象并赋值给“$obj”即可。将一个类实例化后就变成对象&#xff0c;私有函数只能在类内部使用&#xff0c;不能在类外&…

Centos7 开启端口

CentOS7默认没有使用iptables&#xff0c;所以通过编辑iptables的配置文件来开启80端口是不可以的。 CentOS 7 采用了 firewalld 防火墙。 如要查询是否开启80端口&#xff1a; [rootjoe-pc ~]# firewall-cmd --query-port80/tcp no 显然80端口没有开启。 下面我们开启80端口&a…

java flux api,SpringBoot学习系列-WebFlux REST API 全局异常处理

本文内容为什么要全局异常处理&#xff1f;WebFlux REST 全局异常处理实战小结摘录&#xff1a;只有不断培养好习惯&#xff0c;同时不断打破坏习惯&#xff0c;我们的行为举止才能够自始至终都是正确的。一、为什么要全局异常处理&#xff1f;前后端分离开发&#xff0c;一般提…

使您的Java 8方法引用生效

方法参考 众所周知&#xff0c;我们可以使用Java 8中的方法引用 &#xff08;例如String::isEmpty来引用例如在元素上流式传输时使用的方法。 看一下以下代码片段&#xff1a; Stream.of("A", "", "B").filter(Stream::isEmpty).count();它将产…

down.php无法打开,php下载文件 图片不能打开,该怎么解决

php下载文件 图片不能打开function fileDown($file_name){$file_name iconv("utf-8","gb2312",$file_name);$file_path "E:/php/down/".$file_name;if(!file_exists($file_path)){echo "文件不存在";return;}$fp fopen($file_path,…

【转】Linux如何在系统启动时自动加载模块

1、Linux安装驱动程序 tar zxf ixgbe-<x.x.x>.tar.gz cd ixgbe-<x.x.x>/src/ make install modprobe <ixgbe> 卸载驱动 cd ixgbe-<x.x.x>/src/ make uninstall 2、Linux如何在系统启动时自动加载模块 原文&#xff1a;http://www.cnblogs.com/image-ey…

MATLAB小记_fread的用法

“fread”以二进制形式&#xff0c;从文件读出数据。语法1&#xff1a;[a,count]fread(fid,size,precision)语法2&#xff1a;[a,count]fread(fid,size,precision,skip)size: 不指定 &#xff1a;到尾返回读。N : 读出N个数据&#xff0c;构成列向量。inf …

mvvm 后端_ZK实际应用:MVVM –与ZK客户端API一起使用

mvvm 后端在以前的文章中&#xff0c;我们已经使用ZK的MVVM实现了以下功能&#xff1a; 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是&#xff0c;我们不直接在controller&#xff08;ViewModel&#xff0…

微信分享朋友圈固定缩略图 php,微信转发或分享朋友圈带缩略图、标题和描述的实现方法...

自己做博客以来&#xff0c;很早之前分享过文章至朋友圈&#xff0c;那个时候分享过去的文章自动获取页面的比例适合的图片为所缩略图&#xff1a;后期就很少分享至朋友圈&#xff0c; 近来分享文章给朋友后&#xff0c;发现不带缩略图和简介了&#xff0c;觉得这样很不好看&am…

Oracle 用户、表空间、授权、备份、导入等操作相关

一、基础操作 闲来无事&#xff0c;整理oracle数据库相关操作&#xff0c;以后备用。。。。。 ps&#xff1a; satp 为用户 satp_data 为表空间 1 1.删除表空间2 DROP TABLESPACE satp_data INCLUDING CONTENTS AND DATAFILES;3 4 2.删除用户5 drop user satp cascade;6 …