广告位联系
返回顶部
分享到

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

Mysql 来源:互联网搜集 作者:酷站 发布时间:2018-07-21 08:09:07 人浏览
摘要

自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程。 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难。最近正好要开发一个功能模块,就是需要统一对设备进行处理,想

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

因为项目里设备的种类比较多,分别存在不同的数据表中,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



版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
    Tag :
相关文章
  • 深入了解MySQL中的慢查询
    一、什么是慢查询 什么是MySQL慢查询呢?其实就是查询的SQL语句耗费较长的时间。 具体耗费多久算慢查询呢?这其实因人而异,有些公司慢
  • MySQL中with rollup的用法及说明

    MySQL中with rollup的用法及说明
    MySQL with rollup的用法 当需要对数据库数据进行分类统计的时候,往往会用上groupby进行分组。 而在groupby后面还可以加入withcube和withrollup等关
  • mysql分组统计并求出百分比的方法

    mysql分组统计并求出百分比的方法
    mysql分组统计并求出百分比 1、mysql 分组统计并列出百分比 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 SELECT point_id, pname_cn, play_
  • 30种SQL语句优化的方法总结
    1)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2)应尽量避免在 where 子句中使用!=或操作符
  • 达梦数据库获取SQL实际执行计划的方法

    达梦数据库获取SQL实际执行计划的方法
    环境说明: 操作系统:银河麒麟V10 数据库:DM8 相关关键字:DM数据库、SQL实际执行计划 一、set autotrace trace disql下执行set autotrace trace开启
  • MySQL数据库约束的介绍

    MySQL数据库约束的介绍
    基本介绍 约束用于确保数据库的数据满足特定的商业规则 在mysql中,约束包括:not null,unique,primary key,foreign key 和check5种 1.primary key(主键
  • MySQL索引的介绍

    MySQL索引的介绍
    1. MySQL 索引的最左前缀原则 左前缀原则是联合索引在使用时要遵循的原则,查询索引可以使用联合索引的一部分,但是必须从最左侧开始。
  • windows下Mysql多实例部署的操作方法
    当存在多个项目的时候,需要同时部署时,且只有一台服务器时,哪么就需要部署Mysql多个实例,原理很简单,多个mysql服务运行使用不同的
  • MySQL客户端/服务器运行架构介绍

    MySQL客户端/服务器运行架构介绍
    之前对MySQL的认知只限于会写些SQL,本篇开始进行对MySQL进行深入的学习,记录和整理下自己对MySQL不熟悉的地方。如果有需要可以关注我的
  • mysql8.0主从复制搭建与配置方案

    mysql8.0主从复制搭建与配置方案
    mysql主从搭建 环境:ubuntu20.04.1,mysql:8.0.22。 主:192.168.87.3 备:192.168.87.6 安装数据库 1 2 3 sudo apt-get install mysql-server sudo apt-get install mysql
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计