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

总结

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

(0)

相关推荐

  • MySQL在多表上创建视图方法

    MySQL中,在两个或者以上的基本表上创建视图 在student表和stu_info表上,创建stu_class视图,查询出s_id号.姓名和班级 首先,创建stu_info表,并向表中插入数据 查看表中的数据 创建stu_class视图 查看视图 可以看出,创建的视图包含id.name和class字段 其中,id字段对应student表中的s_id字段,name字段对应student表中的name字段,class字段对应stu_info表中的class字段

  • mysql多表连接查询实例讲解

    实际的项目,存在多张表的关联关系.不可能在一张表里面就能检索出所有数据.如果没有表连接的话,那么我们就需要非常多的操作.比如需要从A表找出限制性的条件来从B表中检索数据.不但需要分多表来操作,而且效率也不高.比如书中的例子: 代码如下: SELECT FId FROM T_Customer WHERE FName='MIKE' 这个SQL语句返回2,也就是姓名为MIKE 的客户的FId值为2,这样就可以到T_Order中检索FCustomerId等于2 的记录: 代码如下: SELECT FNu

  • MySQL中Update、select联用操作单表、多表,及视图与临时表的区别

    一.MySQL中使用从表A中取出数据来更新表B的内容 例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin.SQL语言中不要显示的出现select关键字 update data d,chanpin c set d.zhulei=c.zhulei,d.xiaolei=c.xiaolei,d.fenxiang=c.fenxiang,d.zhuanye=c.zhuanye,d.jiliang=c.jiliang,d.gs=c.zgs,d.xzgs=c.zgs,d.

  • MySQL多表链接查询核心优化

    概述 在一般的项目开发中,对数据表的多表查询是必不可少的.而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始.其他优化操作,后续另外更新,敬请关注. 数据背景 现假设有一个中学学校,学校中的年级有一年级.二年级.三年级,每个年级有两个班级.分别为101.102.201.202.301.302. 现在我们要为这个学校建立一个考试成绩统计系统.为此,我们对数据库的设计画了如下ER图: 根据ER图,我们设计了数据表,结构如下: class

  • MySQL中基本的多表连接查询教程

    一.多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN 2.   内连接INNER JOIN 在MySQL中把I SELECT * FROM table1 CROSS JOIN tabl

  • 浅谈mysql中多表不关联查询的实现方法

    大家在使用MySQL查询时正常是直接一个表的查询,要不然也就是多表的关联查询,使用到了左联结(left join).右联结(right join).内联结(inner join).外联结(outer join).这种都是两个表之间有一定关联,也就是我们常常说的有一个外键对应关系,可以使用到 a.id = b.aId这种语句去写的关系了.这种是大家常常使用的,可是有时候我们会需要去同时查询两个或者是多个表的时候,这些表又是没有互相关联的,比如要查user表和user_history表中的某一些数据

  • MySQL多表数据记录查询详解

    在实际应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录连接查询,简称来年将诶查询. 在具体实现连接查询操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录.连接查询分为内连接查询和外连接查询. 在具体应用中,如果需要实现多表数据记录查询,一般不使用连接查询,因为该操作效率比较低.于是MySQL又提供 了连接查询的替代操作,子查询操作. 1.关系数据操作:  在连接查询中,首先需要对两张或两张以上的表进行连接操作.连接操作是关系数据操作中

  • mysql delete 多表连接删除功能

    单个表的删除: DELETE FROM tableName WHERE columnName = value; 删除表内的所有行: 即:保留表的结构.属性.索引 DELETE FROM tablename; DELETE * FROM tablename; 删除同一张表内的所有内容(删除数据.表结构) TRUNCATE customer; 无法报告删除了几行,且只能用于单一表 多表连接删除: DELETE orders,itrms FROM orders,items WHERE orders.u

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

    前言 自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程. 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难.最近正好要开发一个功能模块,就是需要统一对设备进行处理,想着为了以后都能方便的统一处理各种设备,就从现在开始设计一套方案管理起这些项目吧. 如何统一管理呢? 如果从项目一开始设计的时候就能考虑到项目会发展成今天这样,当初就应该抽取公共父类,对所有类型的所有公共字段进行统一抽取,这样无论添加多少模块,

  • MySQL中dd::columns表结构转table过程及应用详解

    目录 一.MySQL的dd表介绍 二.代码跟踪 三.知识应用 四.总结 一.MySQL的dd表介绍 MySQL的dd表是用来存放表结构和各种建表信息的,客户端建的表都存在mysql.table和mysql.columns表里,还有一个表mysql.column_type_elements比较特殊,用来存放SET和ENUM类型的字段集合值信息.看一下下面这张表的mysql.columns表和mysql.column_type_elements信息.为了缩短显示长度,这里只展示几个重要的值. #建表

  • MySQL存储过程的创建使用以及实现数据快速插入

    目录 一,存储过程介绍 二,存储过程的优缺点 三,存储过程的创建与调用 3.1,存储过程中的常用语法及参数 3.2,存储过程的使用 四,存储过程中的变量及使用细则 4.1,变量定义 4.2,变量赋值 4.3,用户变量的使用 4.4,存储过程的一些常用查看命令 五,常用的存储过程的控制语句 5.1,条件语句 5.1.1,if-then-else 5.1.2,case语句 5.2,循环语句 5.2.1,while ……end while语句 5.2.2,repeat……end repeat语句 5.

  • mysql 循环批量插入的实例代码详解

    背景 前几天在MySql上做分页时,看到有博文说使用 limit 0,10 方式分页会有丢数据问题,有人又说不会,于是想自己测试一下.测试时没有数据,便安装了一个MySql,建了张表,在建了个while循环批量插入10W条测试数据的时候,执行时间之长无法忍受,便查资料找批量插入优化方法,这里做个笔记. 数据结构 寻思着分页时标准列分主键列.索引列.普通列3种场景,所以,测试表需要包含这3种场景,建表语法如下: drop table if exists `test`.`t_model`; Crea

  • Oracle 数据仓库ETL技术之多表插入语句的示例详解

    目录 创建示例表 无条件的 INSERT ALL 语句 有条件的 INSERT ALL 语句 有条件的 INSERT FIRST 语句 多表插入语句的限制 大家好!我是只谈技术不剪发的 Tony 老师. ETL(提取.转换.加载)是指从源系统中提取数据并将其放入数据仓库的过程.Oracle 数据库为 ETL 流程提供了丰富的功能,今天我们就给大家介绍一下 Oracle 多表插入语句,也就是INSERT ALL语句. 创建示例表 我们首先创建一个源数据表和三个目标表: CREATE TABLE s

  • MySQL实现数据插入操作的示例详解

    目录 一.方法分类 二.具体方法 三.实例 (1)常规插入 (2)从另一个表导入 (3)插入时数据重复 四.注意事项 (1)不写字段名,需要填充自增ID (2)按字段名填充,可以不录入id 其余注意事项 使用MySQL插入数据时,可以根据需求场景选择合适的插入语句,例如当数据重复时如何插入数据,如何从另一个表导入数据,如何批量插入数据等场景.本文通过给出每个使用场景下的实例来说明数据插入的实现过程和方法. 一.方法分类 二.具体方法 使用场景 作用 语句 注意 常规插入 忽略字段名 insert

  • Vue零基础入门之模板语法与数据绑定及Object.defineProperty方法详解

    目录 初识vue 模板语法 插值语法 指令语法 数据绑定 单向绑定 双向绑定 el和data的两种写法 el data Object.defineProperty方法 事件处理 事件修饰符 键盘事件 定义命名(不常用) 初识vue vue工作时,必须先创建Vue实例,且要传入一个配置对象 容器内的代码依然符合html规范,混入了一些特殊的Vue语法 <div id="root"> <h1>hello,{{name}}</h1> </div>

  • Javaweb中Request获取表单数据的四种方法详解

    目录 表单代码 request.getParamter(String name);通过name获取值 request.getParamterValues(String name);通过name获取value值(一般用于复选框获取值) 代码片段 request.getParameterNames();直接获取表单所有对象的name值,返回值是枚举集合 request.getParameterMap();直接获取表单所有对象的name值以及数据 表单代码 <!DOCTYPE html> <h

  • C语言线性表的链式表示及实现详解

    目录 前言 代码实现 1. 单链表的结点构造 2. 构造一个空的头结点 3. 对线性表进行赋值 4.对线性表进行销毁 5.对线性表进行重置 6.判断线性表是否为空 7.获取线性表的长度 8.获取线性表某一位置对应的元素 9.在线性表某一位置插入元素 10.删除线性表某一位置的元素 11.求线性表某一元素的前驱 12.求线性表某一元素的后继 13.打印线性表 运行结果演示 源码 前言 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,而线性表的链式存储特点则是用一组任意的存储

  • C语言顺序表的基本结构与实现思路详解

    目录 一.顺序表的概念与结构 1.线性表的解释 2.顺序表概念解释 二.顺序表的思路及代码实现详解 1.静态顺序表的实现 2.动态顺序表思路及代码实现 2.1 动态顺序表的整体思路 2.2 定义结构体的实现 2.3 初始化结构体 2.4 结构体打印 2.5 检查数组容量 2.6 头插 2.7 尾插 2.8 头删 2.9 尾删 2.10 任意删除 2.11 任意插入 2.12 空间释放 三.顺序表代码整合 SeqList.h SeqList.c test.c 一.顺序表的概念与结构 1.线性表的解

随机推荐