• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
右脸破相gl 显示全部楼层 发表于 2021-10-26 14:08:14 |阅读模式 打印 上一主题 下一主题
媒介
自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程。
因为项目里装备的种类比较多,分别存在差别的数据表中,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判定,大概是像下面如许,先移动游标,再判定插入

末了贴上代码吧,方便以后本身复制粘贴,不是有句话叫 ”天下代码一大抄,看你会不会抄“ ,实在开发的日常也就是复制粘贴啦
  1. BEGIN
  2. DECLARE dsi_id LONG;
  3. DECLARE dsi_name varchar(300);
  4. DECLARE dsi_areaid LONG;
  5. DECLARE dsi_orgzid LONG;
  6. DECLARE dsi_clazz varchar(300);
  7. declare no_more_departments integer DEFAULT 0;
  8. DECLARE cursor_employee CURSOR FOR
  9. SELECT
  10.   dsi.id,
  11.   dsi.inputname,
  12.   dsi.deviceArea_id,
  13.   sd.organization_id,
  14.   "DeviceSwitchInfo"
  15. FROM
  16.   tip_s_deviceswitchinfo dsi
  17. LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
  18. UNION SELECT
  19.   dsi.id,
  20.   dsi.outputname,
  21.   dsi.deviceArea_id,
  22.   sd.organization_id,
  23.   "DeviceSwitchOutPut"
  24. FROM
  25.   tip_s_DeviceSwitchOutPut dsi
  26. LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
  27. UNION SELECT
  28.   dsi.id,
  29.   dsi.analogname,
  30.   dsi.deviceArea_id,
  31.   sd.organization_id,
  32.   "AnalogInputInfo"
  33. FROM
  34.   tip_s_AnalogInputInfo dsi
  35. LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
  36. UNION SELECT
  37.   dsi.id,
  38.   dsi.devicename,
  39.   dsi.area_id,
  40.   sd.organization_id,
  41.   "SmartDeviceInfo"
  42. FROM
  43.   tip_smart_deviceinfo dsi
  44. LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.deviceid = sd.id;
  45. DECLARE CONTINUE HANDLER FOR NOT FOUND
  46. SET no_more_departments = 1;
  47. OPEN cursor_employee;
  48. FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz;
  49. WHILE !no_more_departments DO
  50. INSERT INTO tip_m_deviceregister (
  51.   deviceId, NAME, area_id, orgz_id, deviceClass, active, version
  52. )
  53. VALUES (dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz, 1, 1);
  54. FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz;
  55. END WHILE;
  56. CLOSE cursor_employee;
  57. END
复制代码
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习大概工作具有肯定的参考学习代价,如果有疑问大家可以留言交换,谢谢大家对脚本之家的支持。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作