有一个数据抽取的题目,一直想用一条程序去实现,问下各位大虾~~

xiyangxixia001 2013-04-28 02:07:50
将数据库A的部门表DEPT,抽取到数据库B的部门表ODS_DEPT(不能使用Truncate方式)

DEPT表
部门 部门名称 更新时间
A AAA 2011/1/1
B BBB 2012/1/1
C CCC 2013/1/1

ODS_DEPT表
部门 部门名称 抽取创建时间 抽取更新时间
A AAA 2011/1/1 2013/1/1
B BBB 2012/1/1 2013/1/1
C CCC 2013/1/1 2013/1/1

题目一:用时间参数做增量抽取,把DEPT表抽取到ODS_DEPT表。要求“抽取创建时间”为第一次抽取的时间,“抽取更新时间”为更新时间。
题目二:假设DEPT已经抽取到ODS_DEPT表,有一天,DEPT表删除了“A部门”这条数据,请修改题目一的程序,保证数据同步到ODS_DEPT.

如以上的题目,两道题目分开做,难度不大。若是题目二能在题目一的基础上加点什么就可以实现数据同步,那就更好了!!
有其他更好的想法吗?@牛人@大虾们@所有人

...全文
345 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗金伟 2013-05-25
  • 打赏
  • 举报
回复
罗金伟 2013-05-25
  • 打赏
  • 举报
回复
求大神,求学习
daiyueqiang2045 2013-05-22
  • 打赏
  • 举报
回复
1:使用增量提取,至于使用什么机制,可使用时间戳、数据库日志等 更加详细的资料 http://download.csdn.net/detail/daiyueqiang/5428181 2:可以基于第一个的基础中,在源表中添加状态字段,当删除时,只是修改数据列队的状态字段。当ETL抽取数据时,根据查询到的删除数据,进行删除源表和目标表数据。
xiyangxixia001 2013-05-20
  • 打赏
  • 举报
回复
引用 7 楼 babyqian84 的回复:
不能使用Truncate方式--- 这句话是对的,通常使用truncate会导致表有短时间的表空白,即便很短哪怕瞬间,也有出问题的可能;应该使用DELETE;INSERT;COMMIT;保证在同一个transaction中。 题目一: 猜测你这个表是一个以时间递增的表,所以不需要全表更新,只要增加新增数据就可以了, select max(抽取创建时间) into v_lastruntime ; insert into ODS_DEPT select a.*,sysdate 抽取更新时间 from DEPT@dblink a where a.更新时间 > v_lastruntime ; commit; 题目二: 猜测你的表是更新表,每次从DEPT表中的增量并逐条循环,先删除ODS_DEPT表中对应的数据,然后insert表DEPT的新数据到ODS_DEPT中。 要解决DEPT的删除动作也同步到ODS_DEPT中,可以在表DEPT建立一个TRIGGER,或者看DEPT表是否有更新的历史记录,从历史记录中寻找到DELETE的动作然后在自己的程序中更新。 这个问题其实很简单,就是我要自动获取人家的数据,但是人家的数据有变化总要告诉我,程序才能做事呀,DEPT的INSERT,UPDATE都是通过更新时间这个栏位来告诉我的,但是DELETE这个动作你必须要告诉我才行,否则程序怎么知道,所以用TRIGGER,或者DELETE时在另一张表留下记录,否则的话,只能全表更新了。 所以合理的设计是常规的增删改都要有保存历史记录,不想保存记录你就要允许我建立trigger,有时候是要强势的要求上家更改为合理的设计的。(偶发的情况是可以手动更改的,因为不会有一个程序完全不需要人为干预,总有意外发生需要人为修改数据,但前提是上家履行告知下家的义务)
谢谢分析!学习了!!
u010448762 2013-05-10
  • 打赏
  • 举报
回复
求大神,求学习
babyqian84 2013-05-09
  • 打赏
  • 举报
回复
不能使用Truncate方式--- 这句话是对的,通常使用truncate会导致表有短时间的表空白,即便很短哪怕瞬间,也有出问题的可能;应该使用DELETE;INSERT;COMMIT;保证在同一个transaction中。 题目一: 猜测你这个表是一个以时间递增的表,所以不需要全表更新,只要增加新增数据就可以了, select max(抽取创建时间) into v_lastruntime ; insert into ODS_DEPT select a.*,sysdate 抽取更新时间 from DEPT@dblink a where a.更新时间 > v_lastruntime ; commit; 题目二: 猜测你的表是更新表,每次从DEPT表中的增量并逐条循环,先删除ODS_DEPT表中对应的数据,然后insert表DEPT的新数据到ODS_DEPT中。 要解决DEPT的删除动作也同步到ODS_DEPT中,可以在表DEPT建立一个TRIGGER,或者看DEPT表是否有更新的历史记录,从历史记录中寻找到DELETE的动作然后在自己的程序中更新。 这个问题其实很简单,就是我要自动获取人家的数据,但是人家的数据有变化总要告诉我,程序才能做事呀,DEPT的INSERT,UPDATE都是通过更新时间这个栏位来告诉我的,但是DELETE这个动作你必须要告诉我才行,否则程序怎么知道,所以用TRIGGER,或者DELETE时在另一张表留下记录,否则的话,只能全表更新了。 所以合理的设计是常规的增删改都要有保存历史记录,不想保存记录你就要允许我建立trigger,有时候是要强势的要求上家更改为合理的设计的。(偶发的情况是可以手动更改的,因为不会有一个程序完全不需要人为干预,总有意外发生需要人为修改数据,但前提是上家履行告知下家的义务)
Evershy 2013-05-09
  • 打赏
  • 举报
回复
。。。增量抽取,insert的时候时间字段插入抽取时间到【抽取创建时间】 UPDATE的时候 你时间字段就映射到【抽取更新时间】就行了呗,不需要两条啊
u010617538 2013-05-08
  • 打赏
  • 举报
回复
抽取数据,同步更新数据
graysun 2013-05-07
  • 打赏
  • 举报
回复
这是考试题?
幻想曲 2013-05-03
  • 打赏
  • 举报
回复
引用 2 楼 yinan9 的回复:
这两个题目其实是不同的增量抽取机制。 第一个可以创建一个抽取控制表,来保存session task的运行时间戳,根据时间戳来进行增量抽取。 第二个可以使用全量抽取
+1
yinan9 2013-04-28
  • 打赏
  • 举报
回复
这两个题目其实是不同的增量抽取机制。 第一个可以创建一个抽取控制表,来保存session task的运行时间戳,根据时间戳来进行增量抽取。 第二个可以使用全量抽取
zhaojianmi1 2013-04-28
  • 打赏
  • 举报
回复
其实就是增量抽取,与记录删除的时候如何把目标也删除

246

社区成员

发帖
与我相关
我的任务
社区描述
讨论 Informatica 数据集成相关技术、数据隐私保护相关技术
社区管理员
  • 数据集成社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧