史上最简单的数据抽取
史上最简单的数据抽取 做为一名全职DBA,在之前的工作中,常会收到这样的需求,需要我配合开发定时的从几张目标表取出他们需要的数据,并存放到临时表中,开发们再从临时表中取出数据展现给前端页面。 收到这样的需求,我觉得应该考虑以下几点: (1)目标表有
史上最简单的数据抽取
做为一名全职DBA,在之前的工作中,常会收到这样的需求,需要我配合开发定时的从几张目标表取出他们需要的数据,并存放到临时表中,开发们再从临时表中取出数据展现给前端页面。
收到这样的需求,我觉得应该考虑以下几点:
(1)目标表有哪几张,它们的关联关系如何,这决定了我如何取数据
(2)定时抽取,意味着要周期性的提取数据,此抽取周期是多少?每次抽取数据的频率是多久?
(3)周期性的抽取数据,那么临时表的命名要有规则,通过就是"临时表名_日期时间",这样命名方便开发前端取数
(4)周期性的抽取数据,那么临时表的保留及清理也要考虑一下,防止表空间使用率过高
(5)如果每一次抽取数据消耗的时间比较长,那么要有1个监控的手段,方便查看本次抽取数据的进度
(6)数据抽取的过程中,如果本次抽取数据时发现有问题,那么你抽数的存储过程要可以复用。
也就是说,当前你第2次执行抽数的存储过程时,本次操作之前抽取出的脏数据要清空掉。
那么什么是数据抽取?
最简单的解释就是,从原始数据中抽取出感兴趣数据的过程。
针对上面我总结出的6点,咱们开始模拟一套最简单的数据抽取案例。
(一)、表结构及字段说明
(二)、模拟业务需求
(1)、从emp和dept表中抽取出:emp.empno、emp.ename、emp.job、emp.deptno、dept.dname、dept.loc、sysdate字段,构造产生临时表:T_EMP_DEPT (2)、emp和dept表的关联关系:emp表的deptno字段 参照引用 dept表的deptno字段 (3)、开发人员每天13点会查询使用当天产生的临时表 (4)、每次产生的临时表,保留周期是30天,超过30天的临时表可以被清理掉
(三)、给出解决方案
(1)、从emp和dept表关联查询出需要的字段,关联字段是deptno,并创建临时表:T_EMP_DEPT (2)、每天抽取一次,我们在每天13点之前把临时表创建好就可以了 (3)、临时表的命名规则:T_EMP_DEPT_yyyymmdd(取当前系统的年月日) (4)、抽取数据的存储过程中,加入逻辑判断,取当前系统时间,并将30天前的临时表清除(先truncate,再drop) (5)、单独写1个存储过程及表,用来保存每次抽取数据的进度情况,方便我们监控抽取数据的进度 (6)、在抽取数据的存储过程中,每次都要先truncate临时表、drop临时表,然后再进行本次的数据抽取。实现数据抽取的复用
既然全想清楚了,那么我们就开始操练起来吧
1、创建日志表(存储抽取进度)
650) this.width=650;" title="日志表.png" alt="wKioL1WOS2GjvszPAAUrB8R9cvE643.jpg" />
2、创建监控进度的存储过程
650) this.width=650;" title="监控抽取进度存储过程.png" alt="wKiom1WOSdfCkIcaAASKc1-toA4015.jpg" />
3、创建抽取数据的存储过程
CREATE OR REPLACE PROCEDURE prc_emp_dept authid current_user is table_name_1 varchar2(100); --临时表名 table_flag number; --标识临时表是否存在 0:不存在 1:存在 create_sql varchar2(5000);--创建临时表的SQL语句 insert_sql varchar2(5000);--Insert操作SQL语句 date_30 varchar2(20); --数据过期的时间 30天以前 date_cur varchar2(20); --当前日期 log_detail varchar2(4000); --日志明细参数 begin date_cur := to_char(sysdate, 'yyyymmdd'); --当前日期 date_30 := to_char(sysdate - 30, 'yyyymmdd'); --30天以前的日期 table_flag := 0; --初始状态0,目标不存在 table_name_1 := 'T_EMP_DEPT'||date_cur; ---如果临时表存在先清空、再干掉(实现功能复用) execute immediate 'select count(*) from user_tables where table_name='''||table_name_1|| '''' into table_flag; if table_flag = 1 then execute immediate 'truncate table '||table_name_1; execute immediate 'drop table '||table_name_1; --日志明细信息 log_detail := '删除临时表的时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','00',log_detail); end if; ---创建中间表T_EMP_DEPTyyyymmdd create_sql :='create table '|| table_name_1 || ' nologging as select e.EMPNO , e.ENAME , e.JOB , e.MGR , e.HIREDATE, e.SAL , e.COMM , e.DEPTNO , d.DNAME , d.LOC , sysdate as current_time from emp e,dept d where e.deptno=d.deptno'; execute immediate create_sql; --日志明细信息 log_detail := '中间表创建完毕时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','01',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第1次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','02',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第2次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','03',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第3次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','04',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第4次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','05',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第5次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','06',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第6次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','07',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第7次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','08',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第8次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','09',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第9次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','10',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第10次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','11',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第11次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','12',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第12次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','13',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第13次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','14',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第14次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','15',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第15次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','16',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第16次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','17',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第17次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','18',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第18次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','19',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第19次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','20',log_detail); insert_sql :='insert into '|| table_name_1 ||' select * from '|| table_name_1; execute immediate insert_sql; commit; --日志明细信息 log_detail := '第20次往中间表插入数据完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','21',log_detail); P_INSERT_LOG(sysdate,'prc_emp_dept','22','抽取数据部分结束了!'); ---删除30天以前的临时表 execute immediate 'select count(*) from user_TABLES where table_name=''T_EMP_DEPT'||date_30 || '''' into table_flag; if table_flag = 1 then --找到了30天前的表 execute immediate ' truncate table T_EMP_DEPT' ||date_30; execute immediate ' drop table T_EMP_DEPT' ||date_30; log_detail := '删除30天前临时表完成时间:' ||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); P_INSERT_LOG(sysdate,'prc_emp_dept','23',log_detail); end if; end prc_emp_dept; /
4、使用sys用户显示授权给scott,防止dbms_job调用存储过程时报没有权限
5、查看监控日志表(新表什么也没有)
6、手工执行抽取数据的存储过程
7、查看监控日志表(记录得比较详细)
朋友们,咱们的数据抽取功能、监控抽取进度、业务的需求咱们基本就全完成了。
现在还差1项就是把抽取数据的存储过程设置成定时任务,然后周期性的执行。
常用的定时任务有2种:
a.crontab (操作系统层面的)
b.dbms_job (oracle自带的)
将咱们的数据抽取存储过程加入到定时任务,让它自己周期性的执行就可以了。
8、我使用的是dbms_job,详细如下图
好了,朋友们至此,本套史上最简单的数据自动抽取文章就结束了!
此篇文章中涵盖了以下知识点:
1、SQL多表联合查询
2、关于业务的分析及思考
3、数据的自动抽取
4、数据抽取的进度监控
5、定时任务
6、表的管理
结束语:
相信大家已经发现了,本次文章中使用到的操作用户是scott,咱们oracle中基础练习的用户。
本篇文章是我上课的一个小案例,我的学生们反应不错,他们说接受起来比较容易。
所以我就把这个小案例移植到了51的博客上,分享给更多需要的朋友们!
其实每个人都有拖延症,都会害怕去尝试新鲜事物,所以我想说本篇文章:
送给想做数据抽取的朋友们、
送给对数据处理感兴趣的朋友们、
送给想学习oracle开发方向的朋友们、
送给想和做不同步的朋友们、
送给想学习的朋友们
附:本篇文章中的代码,全部手工测试过没有问题。如果朋友们在操作过程中发现报错,请好好检查一下代码。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

DDREASE是一种用于从文件或块设备(如硬盘、SSD、RAM磁盘、CD、DVD和USB存储设备)恢复数据的工具。它将数据从一个块设备复制到另一个块设备,留下损坏的数据块,只移动好的数据块。ddreasue是一种强大的恢复工具,完全自动化,因为它在恢复操作期间不需要任何干扰。此外,由于有了ddasue地图文件,它可以随时停止和恢复。DDREASE的其他主要功能如下:它不会覆盖恢复的数据,但会在迭代恢复的情况下填补空白。但是,如果指示工具显式执行此操作,则可以将其截断。将数据从多个文件或块恢复到单

0.这篇文章干了啥?提出了DepthFM:一个多功能且快速的最先进的生成式单目深度估计模型。除了传统的深度估计任务外,DepthFM还展示了在深度修复等下游任务中的最先进能力。DepthFM效率高,可以在少数推理步骤内合成深度图。下面一起来阅读一下这项工作~1.论文信息标题:DepthFM:FastMonocularDepthEstimationwithFlowMatching作者:MingGui,JohannesS.Fischer,UlrichPrestel,PingchuanMa,Dmytr

如果您需要了解如何在Excel中使用具有多个条件的筛选功能,以下教程将指导您完成相应步骤,确保您可以有效地对数据进行筛选和排序。Excel的筛选功能是非常强大的,能够帮助您从大量数据中提取所需的信息。这个功能可以根据您设定的条件,过滤数据并只显示符合条件的部分,让数据的管理变得更加高效。通过使用筛选功能,您可以快速找到目标数据,节省了查找和整理数据的时间。这个功能不仅可以应用在简单的数据列表上,还可以根据多个条件进行筛选,帮助您更精准地定位所需信息。总的来说,Excel的筛选功能是一个非常实用的

谷歌力推的JAX在最近的基准测试中性能已经超过Pytorch和TensorFlow,7项指标排名第一。而且测试并不是在JAX性能表现最好的TPU上完成的。虽然现在在开发者中,Pytorch依然比Tensorflow更受欢迎。但未来,也许有更多的大模型会基于JAX平台进行训练和运行。模型最近,Keras团队为三个后端(TensorFlow、JAX、PyTorch)与原生PyTorch实现以及搭配TensorFlow的Keras2进行了基准测试。首先,他们为生成式和非生成式人工智能任务选择了一组主流

在iPhone上面临滞后,缓慢的移动数据连接?通常,手机上蜂窝互联网的强度取决于几个因素,例如区域、蜂窝网络类型、漫游类型等。您可以采取一些措施来获得更快、更可靠的蜂窝互联网连接。修复1–强制重启iPhone有时,强制重启设备只会重置许多内容,包括蜂窝网络连接。步骤1–只需按一次音量调高键并松开即可。接下来,按降低音量键并再次释放它。步骤2–该过程的下一部分是按住右侧的按钮。让iPhone完成重启。启用蜂窝数据并检查网络速度。再次检查修复2–更改数据模式虽然5G提供了更好的网络速度,但在信号较弱

哭死啊,全球狂炼大模型,一互联网的数据不够用,根本不够用。训练模型搞得跟《饥饿游戏》似的,全球AI研究者,都在苦恼怎么才能喂饱这群数据大胃王。尤其在多模态任务中,这一问题尤为突出。一筹莫展之际,来自人大系的初创团队,用自家的新模型,率先在国内把“模型生成数据自己喂自己”变成了现实。而且还是理解侧和生成侧双管齐下,两侧都能生成高质量、多模态的新数据,对模型本身进行数据反哺。模型是啥?中关村论坛上刚刚露面的多模态大模型Awaker1.0。团队是谁?智子引擎。由人大高瓴人工智能学院博士生高一钊创立,高

最近,军事圈被这个消息刷屏了:美军的战斗机,已经能由AI完成全自动空战了。是的,就在最近,美军的AI战斗机首次公开,揭开了神秘面纱。这架战斗机的全名是可变稳定性飞行模拟器测试飞机(VISTA),由美空军部长亲自搭乘,模拟了一对一的空战。5月2日,美国空军部长FrankKendall在Edwards空军基地驾驶X-62AVISTA升空注意,在一小时的飞行中,所有飞行动作都由AI自主完成!Kendall表示——在过去的几十年中,我们一直在思考自主空对空作战的无限潜力,但它始终显得遥不可及。然而如今,

这周,由OpenAI、微软、贝佐斯和英伟达投资的机器人公司FigureAI宣布获得接近7亿美元的融资,计划在未来一年内研发出可独立行走的人形机器人。而特斯拉的擎天柱也屡屡传出好消息。没人怀疑,今年会是人形机器人爆发的一年。一家位于加拿大的机器人公司SanctuaryAI最近发布了一款全新的人形机器人Phoenix。官方号称它能以和人类一样的速率自主完成很多工作。世界上第一台能以人类速度自主完成任务的机器人Pheonix可以轻轻地抓取、移动并优雅地将每个对象放置在它的左右两侧。它能够自主识别物体的
