最近项目进行到模型这一块,数据库中用到了存储过程,所以趁这个机会小结一下。
所谓存储过程,简单的理解就是一个可以多次运行但是只需要一次编写的SQL语句集合,为什么这么说呢?
看一下存储过程的语法:
主体部分就是正常的SQL语句了。一次编写完成之后,如何多次运行呢?
运行下面的语法即可:
光说不练假把式,所以:
我有两张表,一张是模型的特征表,另外其余的十八张表则是副表,项目中的特征表包括农户的加权教育得分、加权年龄得分、土地等等字段,。
这些字段分别来自于十八张表,并且不是简单的从十八张表中提取,是需要对这十八张表的信息进行加工处理之后才汇总到特征表中。
可以看到,上面存储过程的意思就是从不同的表中找出对应的字段及值然后插入到特征表中,如果说数据有更新的话,就直接来一句:
就可以实现对特征表数据的更新。
是不是很方便呢?
当然,肯定会有小伙伴问了,为什么要用INSERT而不是UPDATE呢?这就不得不提商业用途的代码和普通自己做个小项目的代码的区别了。
商业用途的代码强调数据的可追溯性
对于UPDATE,如果出错,很难找到出错的原因
INSERT不会更改原数据,也就印证了第一条,数据的可追溯性
除此之外,对于存储过程,上面的代码没有展示步骤日志部分。该部分在商业用途的代码中非常重要,因为有利于后期数据的维护,这一点非常有必要,不然,百万级别的数据出错,排查错误的时候得累死。
下面就说说对于脏数据的排查。
还是以上面的农户数据为例:
在一开始,获取表主键以及户主身份证都好说,但是,在获取加权年龄得分的时候却出了问题。
由于数据中只提供了身份证号,所以要想获得农户户成员的年龄,理所当然的想到了提取身份证的出生日期,然后拿今天的日期进行对比,就可以知道该户成员的年龄了,但是梦想很丰满,现实很骨感。
语句的具体含义请移步:
Oracle中SQL根据生日日期查询年龄的方法:
https://www.bbsmax.com/A/D854Kb83JE/
说明:该链接不是超链接模式,点击没有任何反应,请手动复制到浏览器打开。若链接失效,请留言。
我在自己的机子上可以完美运行,使用这一句就可以提取出来用户的年龄。
但是一拿到项目上就报错:
ORA-01847: day of month must be between 1 and last day of month
既然报了错那就查错呗,然后就是各种Google,一开始以为是语法的问题,包括日期的格式改成'YYMONDD',还是不行。当被逼到一定程度的时候,真的是有的没的全都怀疑,一开始使用的是Navicat Premium连接数据库,在甲方的机子上报错,换了PL_SQL。你还别说,甲方作为企业,使用某些软件还是有道理的。
使用PL_SQL运行发现有一部分可以提取出来,就很纳闷了,咋回事呢?年龄可以提取出来,计算得分咋就报错呢?!!!然后就是各种找方案,还是没有结果,都要炸了。
实在没办法,问了甲方的一个管数据库的工作人员,人家看了一眼,在运行窗口有一个往下的按钮,点击那个一直运行到最后数据的那个按钮果然出错了。“你数据清洗了吗?”一脸懵逼,没有,然后就是刷刷刷,一行代码搞定:
果然,出现了几条身份证出错的数据,还没完,又是刷刷刷,一行代码:
“你这数据质量不咋地啊”,甩下这一句话,飘然而去,只留下我崇拜的目光。
注意啊:做分析,一定要清洗数据,不然后期出了问题,都不知道是代码的原因还是数据的原因,这就是血淋淋的教训。这两行代码可是我花了一天的找错时间才换来的,在这记录一下。既然找到了问题的所在,下面就好办多了
结果出的很完美~~~后面的问题基本上就是依葫芦画瓢,很容易的就解决了。
这样让我深刻体会:
对于问题,第一步,Google,第二步,Google,第三步,找同行
另外,把80%的时间花在20%的事情上,这话说的一点没错,整个存储过程我花了两天半完成了,但是数据质量这个问题却花了我一天的时间,而且是在有人知道的情况下,如果没有人指导,我不知道还要花多久才会想到数据质量这侧面上。
所以,谨记~~~
希望这篇文章对你有所帮助~~~
领取专属 10元无门槛券
私享最新 技术干货