mysql存储过程基础之遍历多表记录后插入第三方表中详解

 更新时间:2018年07月13日 10:16:17   作者:1156740846  
这篇文章主要给大家介绍了关于mysql存储过程教程之遍历多表记录后插入第三方表中的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧

前言

自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程。

因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难。最近正好要开发一个功能模块,就是需要统一对设备进行处理,想着为了以后都能方便的统一处理各种设备,就从现在开始设计一套方案管理起这些项目吧。

如何统一管理呢?

如果从项目一开始设计的时候就能考虑到项目会发展成今天这样,当初就应该抽取公共父类,对所有类型的所有公共字段进行统一抽取,这样无论添加多少模块,需要对设备进行操作的时候,都只需要关联统一父类,数据间的关系就清晰多了,开发也会简单很多。

那么现在抽取呢?还来得及吗?

应该是来不及了,因为项目已经发展壮大了,已经开发了很多功能,一旦现在抽取,需要修改的地方就太多了,没有那么多时间来完成这项工作。

那还有别的方法吗?

我也不晓得人家的项目是如何处理这样的问题的,但是就我思考,可以学习下注册表的思想,电脑中装有很多很多的软件,各个软件也是各部相同,但是每个软件安装的时候都会写一条信息到注册表中,方便电脑对软件的集中管理。是不是感觉这个方案还不错

项目里需要做的就是:1、添加一个注册表对象;2、添加设备的时候,都要把公共的很重要的信息写到注册表中,更新和删除也要同步操作注册表;3、一个很重要的工作,曾经已经添加到项目中的设备信息要怎么办呢?他们都没有注册信息,难不成要放弃对他们的管理?或者是删除重新添加?不!!!只需要写一个存储过程,遍历表里已经存在的设备信息,将其插入注册表中。

好了,人生第一个存储过程就这样拉开序幕了,下面要亮出我的第一个存储过程了:

写的过程中呢肯定是有遇到各种问题的

首先,不记得有哪些循环语句了,下面科普一下

第一种 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判断,或者是像下面这样,先移动游标,再判断插入

最后贴上代码吧,方便以后自己复制粘贴,不是有句话叫 ”天下代码一大抄,看你会不会抄“ ,其实开发的日常也就是复制粘贴啦

BEGIN 

 DECLARE dsi_id LONG;
 DECLARE dsi_name varchar(300);
 DECLARE dsi_areaid LONG;
 DECLARE dsi_orgzid 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.organization_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.organization_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.organization_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.organization_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_orgzid, dsi_clazz;

 WHILE !no_more_departments DO

 INSERT INTO tip_m_deviceregister (
  deviceId, NAME, area_id, orgz_id, deviceClass, active, version
 )
 VALUES (dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz, 1, 1);

 FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz;
 END WHILE;
 CLOSE cursor_employee;
END

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Mysql生成数据字典的原理与实例

    Mysql生成数据字典的原理与实例

    数据字典是一名DBA需要维护的重要内容,有人喜欢用excel来维护,本人更喜欢直接在数据库上进行维护,下面这篇文章主要给大家介绍了关于Mysql生成数据字典的原理与实例,以及导出MySQL的数据字典的方法,需要的朋友可以参考下
    2022-03-03
  • mysql如何统计同一字段不同值的个数

    mysql如何统计同一字段不同值的个数

    这篇文章主要介绍了mysql如何统计同一字段不同值的个数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MySQL 隔离数据列和前缀索引的使用总结

    MySQL 隔离数据列和前缀索引的使用总结

    正确地创建和使用索引对于查询性能十分重要。由于存在很多种特殊场景的优化和行为,因此有很多种方式去有效选择和使用索引。因此,决定如何使用索引这一项技能是需要经验和时间的积累去培养的。以下会介绍一些如何有效使用索引的方法。
    2021-05-05
  • mysql 5.7.18 winx64安装配置方法图文教程

    mysql 5.7.18 winx64安装配置方法图文教程

    这篇文章主要为大家详细介绍了windows7下mysql 5.7.18 winx64安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • MySql设置指定用户数据库查看查询权限

    MySql设置指定用户数据库查看查询权限

    这篇文章主要介绍了MySql设置指定用户数据库查看查询权限,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • CentOS7.4 源码安装MySQL8.0的教程详解

    CentOS7.4 源码安装MySQL8.0的教程详解

    这篇文章主要介绍了CentOS7.4 源码安装MySQL8.0的教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • MySQL监控Innodb信息工作流程

    MySQL监控Innodb信息工作流程

    这篇文章主要为大家介绍了MySQL监控Innodb信息工作流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-02-02
  • mysql 8.0.21免安装版配置方法图文教程

    mysql 8.0.21免安装版配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.21免安装版配置教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Mysql数据库中子查询的使用

    Mysql数据库中子查询的使用

    本文给大家分享mysql数据库中子查询的使用,非常不错具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-10-10
  • CentOS8下MySQL 8.0安装部署的方法

    CentOS8下MySQL 8.0安装部署的方法

    这篇文章主要介绍了CentOS 8下 MySQL 8.0 安装部署的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论