溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中的示例分析

發(fā)布時間:2021-07-29 13:55:52 來源:億速云 閱讀:170 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章主要介紹mysql存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

前言

自從學(xué)過存儲過程后,就再也沒有碰過存儲過程,這是畢業(yè)后寫的第一個存儲過程。

因為項目里設(shè)備的種類比較多,分別存在不同的數(shù)據(jù)表中,java中對應(yīng)不同的java bean對象,想要統(tǒng)一管理有點困難。最近正好要開發(fā)一個功能模塊,就是需要統(tǒng)一對設(shè)備進(jìn)行處理,想著為了以后都能方便的統(tǒng)一處理各種設(shè)備,就從現(xiàn)在開始設(shè)計一套方案管理起這些項目吧。

如何統(tǒng)一管理呢?

如果從項目一開始設(shè)計的時候就能考慮到項目會發(fā)展成今天這樣,當(dāng)初就應(yīng)該抽取公共父類,對所有類型的所有公共字段進(jìn)行統(tǒng)一抽取,這樣無論添加多少模塊,需要對設(shè)備進(jìn)行操作的時候,都只需要關(guān)聯(lián)統(tǒng)一父類,數(shù)據(jù)間的關(guān)系就清晰多了,開發(fā)也會簡單很多。

那么現(xiàn)在抽取呢?還來得及嗎?

應(yīng)該是來不及了,因為項目已經(jīng)發(fā)展壯大了,已經(jīng)開發(fā)了很多功能,一旦現(xiàn)在抽取,需要修改的地方就太多了,沒有那么多時間來完成這項工作。

那還有別的方法嗎?

我也不曉得人家的項目是如何處理這樣的問題的,但是就我思考,可以學(xué)習(xí)下注冊表的思想,電腦中裝有很多很多的軟件,各個軟件也是各部相同,但是每個軟件安裝的時候都會寫一條信息到注冊表中,方便電腦對軟件的集中管理。是不是感覺這個方案還不錯

項目里需要做的就是:1、添加一個注冊表對象;2、添加設(shè)備的時候,都要把公共的很重要的信息寫到注冊表中,更新和刪除也要同步操作注冊表;3、一個很重要的工作,曾經(jīng)已經(jīng)添加到項目中的設(shè)備信息要怎么辦呢?他們都沒有注冊信息,難不成要放棄對他們的管理?或者是刪除重新添加?不?。?!只需要寫一個存儲過程,遍歷表里已經(jīng)存在的設(shè)備信息,將其插入注冊表中。

好了,人生第一個存儲過程就這樣拉開序幕了,下面要亮出我的第一個存儲過程了:

mysql存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中的示例分析

寫的過程中呢肯定是有遇到各種問題的

首先,不記得有哪些循環(huán)語句了,下面科普一下

第一種 while 循環(huán)

while循環(huán)語法:

while 條件 DO

            循環(huán)體;

end while;

第二種 loop 循環(huán)

loop 循環(huán)語法:

loop_name:loop

        if 條件 THEN -- 滿足條件時離開循環(huán)

                leave loop_name;  -- 和 break 差不多都是結(jié)束訓(xùn)話

        end if;

end loop;

第三種 repeat 循環(huán)

repeat 循環(huán)語法

repeat

    循環(huán)體

until 條件 end repeat;

 其次,遇到一個問題,循環(huán)的時候,最后一條記錄總是被執(zhí)行了兩次。

一開始使用的是repeat循環(huán)體,以為是因為還沒有判斷就執(zhí)行了,肯定是不對的,應(yīng)該先判斷,再執(zhí)行,以為換一種循環(huán)語句便可以了

原先是這樣的

mysql存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中的示例分析

后來改成了這樣

mysql存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中的示例分析

看著沒毛病吧,是先判斷后做的,但是結(jié)果還是不對,仔細(xì)研究了一下,發(fā)現(xiàn),當(dāng)游標(biāo)走到最后一行的時候,執(zhí)行insert沒錯,但是這個時候的標(biāo)記值依然是正常的,會再進(jìn)入循環(huán)體,這個時候再去fetch下一個游標(biāo)的時候,就獲取不到了,標(biāo)記值會發(fā)生改變,但是插入語句依然執(zhí)行了,執(zhí)行后,下一次循環(huán)才不符合條件,跳出的循環(huán),因此,應(yīng)該是游標(biāo)下移一行后進(jìn)行判斷,比如在fetch語句后面加一句if判斷,或者是像下面這樣,先移動游標(biāo),再判斷插入

mysql存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中的示例分析

最后貼上代碼吧,方便以后自己復(fù)制粘貼,不是有句話叫 ”天下代碼一大抄,看你會不會抄“ ,其實開發(fā)的日常也就是復(fù)制粘貼啦

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存儲過程基礎(chǔ)之遍歷多表記錄后插入第三方表中的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI