mysql存储过程基础之遍历多表记录后插入第三方表
前言
自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程。
因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难。最近正好要开发一个功能模块,就是需要统一对设备进行处理,想着为了以后都能方便的统一处理各种设备,就从现在开始设计一套方案管理起这些项目吧。
如何统一管理呢?
如果从项目一开始设计的时候就能考虑到项目会发展成今天这样,当初就应该抽取公共父类,对所有类型的所有公共字段进行统一抽取,这样无论添加多少模块,需要对设备进行操作的时候,都只需要关联统一父类,数据间的关系就清晰多了,开发也会简单很多。
那么现在抽取呢?还来得及吗?
应该是来不及了,因为项目已经发展壮大了,已经开发了很多功能,一旦现在抽取,需要修改的地方就太多了,没有那么多时间来完成这项工作。
那还有别的方法吗?
我也不晓得人家的项目是如何处理这样的问题的,就我思考,可以学习下注册表的思想,电脑中装有很多很多的软件,各个软件也是各部相同,每个软件安装的时候都会写一条信息到注册表中,方便电脑对软件的集中管理。是不是感觉这个方案还不错
项目里需要做的就是1、添加一个注册表对象;2、添加设备的时候,都要把公共的很重要的信息写到注册表中,更新和删除也要同步操作注册表;3、一个很重要的工作,曾经已经添加到项目中的设备信息要怎么办呢?他们都没有注册信息,难不成要放弃对他们的管理?或者是删除重新添加?不!!!只需要写一个存储过程,遍历表里已经存在的设备信息,将其插入注册表中。
好了,人生第一个存储过程就这样拉开序幕了,狼蚁网站SEO优化要亮出我的第一个存储过程了
写的过程中呢肯定是有遇到各种问题的
,不记得有哪些循环语句了,狼蚁网站SEO优化科普一下
第一种 while 循环
while循环语法
while 条件 DO
循环体;
end while;
第二种 loop 循环
loop 循环语法
loop_name:loop
if 条件 THEN -- 满足条件时离开循环
leave loop_name; -- 和 break 差不多都是结束训话
end if;
end loop;
第三种 repeat 循环
repeat 循环语法
repeat
循环体
until 条件 end repeat;
,遇到一个问题,循环的时候,一条记录总是被执行了两次。
一开始使用的是repeat循环体,以为是因为还没有判断就执行了,肯定是不对的,应该先判断,再执行,以为换一种循环语句便可以了
原先是这样的
后来改成了这样
看着没毛病吧,是先判断后做的,结果还是不对,仔细研究了一下,发现,当游标走到一行的时候,执行insert没错,这个时候的标记值依然是正常的,会再进入循环体,这个时候再去fetch下一个游标的时候,就获取不到了,标记值会发生改变,插入语句依然执行了,执行后,下一次循环才不符合条件,跳出的循环,,应该是游标下移一行后进行判断,比如在fetch语句后面加一句if判断,或者是像狼蚁网站SEO优化这样,先移动游标,再判断插入
贴上代码吧,方便以后自己复制粘贴,不是有句话叫 ”天下代码一大抄,看你会不会抄“ ,其实开发的日常也就是复制粘贴啦
BEGIN DECLARE dsi_id LONG; DECLARE dsi_name varchar(300); DECLARE dsi_areaid LONG; DECLARE dsi_zid LONG; DECLARE dsi_clazz varchar(300); declare no_more_departments integer DEFAULT 0; DECLARE cursor_employee CURSOR FOR SELECT dsi.id, dsi.inputname, dsi.deviceArea_id, sd.anization_id, "DeviceSwitchInfo" FROM tip_s_deviceswitchinfo dsi LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id UNION SELECT dsi.id, dsi.outputname, dsi.deviceArea_id, sd.anization_id, "DeviceSwitchOutPut" FROM tip_s_DeviceSwitchOutPut dsi LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id UNION SELECT dsi.id, dsi.analogname, dsi.deviceArea_id, sd.anization_id, "AnalogInputInfo" FROM tip_s_AnalogInputInfo dsi LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id UNION SELECT dsi.id, dsi.devicename, dsi.area_id, sd.anization_id, "SmartDeviceInfo" FROM tip_smart_deviceinfo dsi LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.deviceid = sd.id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments = 1; OPEN cursor_employee; FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_zid, dsi_clazz; WHILE !no_more_departments DO INSERT INTO tip_m_deviceregister ( deviceId, NAME, area_id, z_id, deviceClass, active, version ) VALUES (dsi_id, dsi_name, dsi_areaid, dsi_zid, dsi_clazz, 1, 1); FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_zid, dsi_clazz; END WHILE; CLOSE cursor_employee; END
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对狼蚁SEO的支持。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程