zoukankan      html  css  js  c++  java
  • 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判断,或者是像下面这样,先移动游标,再判断插入

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

     1 BEGIN   
     2 
     3     DECLARE dsi_id LONG;
     4     DECLARE dsi_name varchar(300);
     5     DECLARE dsi_areaid LONG;
     6     DECLARE dsi_orgzid LONG;
     7     DECLARE dsi_clazz varchar(300);
     8     
     9     declare no_more_departments integer DEFAULT 0;
    10 
    11     DECLARE cursor_employee CURSOR FOR
    12         SELECT
    13             dsi.id,
    14             dsi.inputname,
    15             dsi.deviceArea_id,
    16             sd.organization_id,
    17             "DeviceSwitchInfo"
    18         FROM
    19             tip_s_deviceswitchinfo dsi
    20         LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
    21         UNION SELECT
    22             dsi.id,
    23             dsi.outputname,
    24             dsi.deviceArea_id,
    25             sd.organization_id,
    26             "DeviceSwitchOutPut"
    27         FROM
    28             tip_s_DeviceSwitchOutPut dsi
    29         LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
    30         UNION SELECT
    31             dsi.id,
    32             dsi.analogname,
    33             dsi.deviceArea_id,
    34             sd.organization_id,
    35             "AnalogInputInfo"
    36         FROM
    37             tip_s_AnalogInputInfo dsi
    38         LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
    39         UNION SELECT
    40             dsi.id,
    41             dsi.devicename,
    42             dsi.area_id,
    43             sd.organization_id,
    44             "SmartDeviceInfo"
    45         FROM
    46             tip_smart_deviceinfo dsi
    47         LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.deviceid = sd.id;
    48 
    49 
    50     DECLARE CONTINUE HANDLER FOR NOT FOUND 
    51         SET no_more_departments = 1;
    52 
    53     OPEN cursor_employee;
    54     
    55     FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz;
    56 
    57     WHILE !no_more_departments DO
    58 
    59         INSERT INTO tip_m_deviceregister (
    60             deviceId, NAME, area_id, orgz_id, deviceClass, active, version
    61         )
    62         VALUES (dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz, 1, 1);
    63 
    64         FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz;
    65 
    66     END WHILE;
    67 
    68     CLOSE cursor_employee;
    69 
    70 END
  • 相关阅读:
    spring cloud/spring boot同时支持http和https访问
    解决to the cache because there was insufficient free space available after evict
    国外天气api 国际天气预报今天、未来3天、未来7天的天气预报信息接口
    java 访问get接口请求外部的json数据
    IDEA创建基于Maven的SpringBoot项目-多模块
    PostgreSQL提取每个ID的最后一行(Postgresql extract last row for each id)
    Vue项目引入百度地图
    Vue 引入天地图 & 地图类型切换
    js在新窗口打开链接
    mysql使用小数注意
  • 原文地址:https://www.cnblogs.com/LcxSummer/p/9299021.html
Copyright © 2011-2022 走看看